Setup

# load libraries
library(tidyverse)
library(psych)
library(langcog) # source: https://github.com/langcog/langcog
library(RColorBrewer)
library(plotly)
library(lubridate)
library(rms)
library(lme4)
library(brms)
library(parallel)
# clear workspace
# rm(list = ls(all = T))
graphics.off()
# set number of cores for brms
n_cores <- detectCores()
# make rounding function
round2 <- function(x) {format(round(x, 2), nsmall = 2)}
# make cleanup function
cleanup <- function(datasource, age_group) {
  if(grepl("adult", age_group)) {
    
    # set target dataset
    if(datasource == "study 1"){d <- d_raw_study1}
    if(datasource == "study 1b"){d <- d_raw_study1b}
    if(datasource == "study 1c"){d <- d_raw_study1c}
    
    # enact exclusionary criteria
    d_clean_1 <- d
    
    # recode background and demographic variables
    d_clean <- d_clean_1 %>%
      mutate( # deal with study number
        study = factor(study)) %>%
      mutate( # deal with race
        race_cat2 = factor(sub(" +$", "", ethnicity)),
        race_cat3 = factor(ifelse(grepl(" ", race_cat2) == T, "multiracial",
                                  as.character(race_cat2)))) %>%
      dplyr::select(study, subid:country_selfrep, age_group, race_cat3) %>%
      rename(race_cat = race_cat3) %>%
      mutate( # deal with religion (note: only dealing with childhood religion for now)
        religion_cat2 = factor(sub(" +$", "", religionChild)),
        religion_cat3 = factor(ifelse(grepl(" ", religion_cat2) == T, 
                                      "multireligious",
                                      as.character(religion_cat2)))) %>%
      dplyr::select(study:race_cat, religion_cat3) %>%
      rename(religion_cat = religion_cat3)
    
    # remove extraneous dfs and variables
    rm(d, d_clean_1)
  }
  
  if(grepl("child", age_group)) {
    
    # set target dataset
    if(datasource == "study 2"){d <- d_raw_study2}
    # if(datasource == "study 3"){d <- d_raw_study3}
    # if(datasource == "study 4"){d <- d_raw_study4}
    
    # recode background and demographic variables
    d_clean_2 <- d %>%
      mutate( # deal with study number
        study = factor(study),
        responseNum = ifelse(!is.na(responseNum), responseNum,
                             ifelse(response == "no", 0, 
                                    ifelse(response == "kinda", 0.5, 
                                           ifelse(response == "yes", 1, NA)))))
    # NOTE: need to reconcile race/ethnicity at some point...
    # NOTE: need to deal with gender at some point...
  
    d_clean <- d_clean_2
    
    # remove extraneous dfs and variables
    rm(d, d_clean_2)
  }
  
  # remove outliers if desired
  if(chosenOutlierHandling == "remove") {
    
    d_clean <- d_clean %>%
      gather(capacity, score, happy:pride) %>%
      group_by(character, capacity) %>%
      filter(!score %in% boxplot.stats(score, 2.5)$out) %>%
      spread(capacity, score) %>%
      arrange(character, subid)
    
  }
  
  # filter characters if desired
  if(is.element("none", chosenExclude)) {} else {
    
    d_clean <- d_clean %>%
      filter(!character %in% chosenExclude)
    
    }
    
  # filter items if desired
  if(is.element("none", chosenExcludeItem)) {} else {
    d_clean <- d_clean %>%
      dplyr::filter(!capacity %in% chosenExcludeItem)
  }
  
  # drop trials <250 ms
  d_clean <- d_clean %>%
    filter(rt >= 250 | is.na(rt))
  
  # center response variable
  if(datasource == "study 1b") {
    d_clean <- d_clean %>%
      mutate(responseNumC = responseNum - 4)
  } else {
    d_clean <- d_clean %>%
      mutate(responseNumC = responseNum - 0.5)
  }
    # rename character name variables
  if("charName" %in% names(d_clean)) {
    d_clean <- d_clean %>% rename(character = charName)
  }
  
  # cleanup
  d_clean <- d_clean %>%
    filter(!is.na(subid), !is.na(character), !is.na(capacity))
  
  # return cleaned dataset
  return(d_clean)
}
# make function for stripping dataframes for dimension reducation
makeDRDF <- function(datasource, chosenCondition) {
  
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  # filter by character if specified
  if(chosenCondition %in% c("beetle", "robot")) {
    d <- d %>% filter(character == chosenCondition)
  }
  # make stripped dataframe for dimension reducation analyses
  d_strip <- d %>%
    filter(!is.na(character), !is.na(subid), !is.na(capacity), capacity != "") %>%
    mutate(subid = paste(character, subid, sep = "_")) %>%
    select(subid, capacity, responseNum) %>%
    spread(capacity, responseNum) %>%
    remove_rownames() %>%
    column_to_rownames(var = "subid")
  # return stripped dataframe
  return(d_strip)
}
# make demographics functions
demoSampleSize <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  # get distinct subids
  sample_size <- d %>% distinct(subid, character) %>% count(character) %>% data.frame()
  # add total sample size  
  sample_size <- rbind(sample_size %>% mutate(character = as.character(character)),
                       c(character = "all", n = d %>% distinct(subid) %>% count() %>% as.numeric()))
  
  # return dataframe
  return(sample_size)
}
demoDuration <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2 %>% rename(duration = sessionDuration)}
  # get sample size per character
  duration <- d %>%
    distinct(subid, character, duration) %>%
    mutate(duration = as.numeric(duration)) %>%
    group_by(character) %>%
    summarise(min_duration = min(duration, na.rm = T),
              max_duration = max(duration, na.rm = T),
              median_duration = median(duration, na.rm = T),
              mean_duration = mean(duration, na.rm = T),
              sd_duration = sd(duration, na.rm = T))
  # add total duration
  all <- d %>%
    distinct(subid, character, duration) %>%
    mutate(duration = as.numeric(duration)) %>%
    summarise(min_duration = min(duration, na.rm = T),
              max_duration = max(duration, na.rm = T),
              median_duration = median(duration, na.rm = T),
              mean_duration = mean(duration, na.rm = T),
              sd_duration = sd(duration, na.rm = T)) %>%
    mutate(character = "all")
  
  duration <- rbind(duration, all) # not sure why full_join doesn't work    
  # return dataframe
  return(duration)
}
demoAge <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  # get sample size per character
  age <- d %>%
    distinct(subid, character, age) %>%
    mutate(age = as.numeric(age)) %>%
    group_by(character) %>%
    summarise(min_age = min(age, na.rm = T),
              max_age = max(age, na.rm = T),
              median_age = median(age, na.rm = T),
              mean_age = mean(age, na.rm = T),
              sd_age = sd(age, na.rm = T))
  # add total age
  all <- d %>%
    distinct(subid, character, age) %>%
    mutate(age = as.numeric(age)) %>%
    summarise(min_age = min(age, na.rm = T),
              max_age = max(age, na.rm = T),
              median_age = median(age, na.rm = T),
              mean_age = mean(age, na.rm = T),
              sd_age = sd(age, na.rm = T)) %>%
    mutate(character = "all")
  age <- full_join(age, all)
  # return dataframe
  return(age)
}
demoGender <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2}
  # get gender per character and overall
  gender <- data.frame(addmargins(with(d %>% distinct(subid, character, gender), 
                                       table(character, gender)))) %>%
    filter(gender != "Sum") %>%
    rename(n = Freq)
  
  gender <- gender %>%
    mutate(character = factor(ifelse(character == "Sum",
                                     "all", as.character(character)),
                              levels = c("beetle", "robot", "all"))) %>%
    arrange(character, gender) %>%
    spread(gender, n)
  
  # return dataframe
  return(gender)
}
demoRace <- function(datasource) {
  # set target dataset
  if(datasource == "study 1"){d <- d1}
  if(datasource == "study 1b"){d <- d1b}
  if(datasource == "study 1c"){d <- d1c}
  if(datasource == "study 2"){d <- d2 %>% 
    mutate(ethnicity = as.character(ethnicity),
           white = grepl("white", ethnicity) | grepl("cauc", ethnicity) | 
             grepl("euro", ethnicity) | grepl("australia", ethnicity),
           black = grepl("black", ethnicity) | grepl("africa", ethnicity),
           latinx = grepl("hisp", ethnicity) | grepl("latin", ethnicity),
           E_asian = (grepl("east asian", ethnicity) & grepl("southeast", ethnicity) == F) | 
             grepl("chin", ethnicity) | grepl("korea", ethnicity) 
           | grepl("\\(asian\\)", ethnicity) | 
             grepl("\\/asian", ethnicity),
           SSE_asian = grepl("south or southeast", ethnicity) | 
             (grepl("india", ethnicity) & grepl("native", ethnicity) == F) |
             grepl("vietnam", ethnicity) | grepl("pakistan", ethnicity),
           nat_am = grepl("native american", ethnicity),
           middle_east = grepl("middle", ethnicity)) %>%
    mutate(race_cat = ifelse(white + black + latinx + E_asian + SSE_asian + 
                               nat_am + middle_east > 1,
                             "multiracial",
                             ifelse(white, "white",
                                    ifelse(black, "black",
                                           ifelse(latinx, "latinx",
                                                  ifelse(E_asian, "east_asian",
                                                         ifelse(SSE_asian, "south_southeast_asian",
                                                                ifelse(nat_am, "native_american",
                                                                       ifelse(middle_east, "middle_eastern",
                                                                              NA)))))))))
  }
  # get race per character and overall
  race <- data.frame(addmargins(with(d %>% distinct(subid, character, race_cat), 
                                     table(character, race_cat)))) %>%
    filter(race_cat != "Sum") %>%
    rename(n = Freq)
    race <- race %>%
      mutate(character = factor(ifelse(character == "Sum",
                                       "all", as.character(character)))) %>%
      arrange(character, race_cat) %>%
      spread(race_cat, n)
  
  # return dataframe
  return(race)
}
# plotting functions
makeFacetLabs <- function(df_plotting) {
  facet_labels <- array()
  df_plotting <- df_plotting %>% mutate(character = factor(character))
  for(i in 1:length(levels(df_plotting$character))) {
    df <- df_plotting %>% filter(character == levels(df_plotting$character)[i]) %>%
      select(character, n) %>% unique()
    facet_labels[i] <- paste0(df$character, " (n = ", df$n, ")")
  }
  names(facet_labels) <- levels(df_plotting$character)
  return(facet_labels)
}
# remove outliers?
chosenOutlierHandling <- "keep"
# chosenOutlierHandling <- "remove"
# exclude any conditions (characters)?
chosenExclude <- "none"
# chosenExclude <- c("stapler", "car", "computer")
# exclude any items (mental capacities)?
# chosenExcludeItem <- "none"
# chosenExcludeItem <- "computations"
chosenExcludeItem <- c("metal", "on_off")
# NOTE: always choose minimal residual (fm = "minres") instead of ML because of non-normality
# for EFAs, what kind of correlation?
chosenCorType <- "cor" # pearson correlation
# chosenCorType <- "poly" # polychoric correlation
# for EFAs, what kind of rotation?
chosenRotType <- "oblimin" # oblimin rotation
# chosenRotType <- "oblimin" # oblimin rotation
# chosenRotType <- "none" # no rotation
data.frame("conditionsExcluded" = chosenExclude,
           "outlierHandling" = chosenOutlierHandling,
           "EFA_correlation" = chosenCorType,
           "EFA_rotation" = chosenRotType)

back to TOC

Data preparation

# study 1 (2016-07-06, adults, 2 conditions, 3-point scale, "decide what to do" and "make plans")
d_raw_study1 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/adults/us_run-01_2016-06-05_anonymized.csv") %>%
  mutate(study = "study 1", age_group = "adults") %>% select(-X)
# study 1b (2017-07-19, adults, 2 conditions, 7-point scale, "decide what to do" and "make plans")
d_raw_study1b <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/adults/us_run-02_2016-07-19_anonymized.csv") %>%
  mutate(study = "study 1b", age_group = "adults") %>% select(-X)
# study 1c (2016-12-08, adults, 2 conditions, 3-point scale, "have free will" and "have intentions")
d_raw_study1c <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/adults/us_run-03_2016-12-08_anonymized.csv") %>%
  mutate(study = "study 1c", age_group = "adults") %>% select(-X)
# study 2 (June - December 2016, 7-9yo, 2 conditions, 3-point-scale, "decide what to do" and "make plans")
d_raw_study2 <- read.csv("/Users/kweisman/Documents/Research (Stanford)/Projects/Dimkid/dimkid/data/children/run-01_2017-07-24_anonymized.csv") %>%
  mutate(study = "study 2", age_group = "children_79") %>% select(-X)
# clean up datasets
d1 <- cleanup("study 1", "adults")
d1b <- cleanup("study 1", "adults")
d1c <- cleanup("study 1", "adults")
d2 <- cleanup("study 2", "children")
# tweak by hand
d2 <- d2 %>%
  filter(!is.na(age)) %>%
  filter(age >= 7, age < 10) %>%
  filter(character != "elephant")
# fast rt
d_raw_study1 %>% 
  full_join(d_raw_study2) %>%
  filter(!is.na(rt)) %>%
  mutate(rt_cat = ifelse(rt < 250, "<250ms", ">=250ms")) %>% 
  count(age_group, rt_cat) %>%
  group_by(age_group) %>%
  mutate(prop = round(n/sum(n), 2))
Joining, by = c("run", "subid", "age", "gender", "ethnicity", "trialNum", "bgColor", "capacity", "capWording", "hoverTime", "rt", "response", "responseNum", "study", "age_group")
Column `run` joining factors with different levels, coercing to character vectorColumn `subid` joining factors with different levels, coercing to character vectorColumn `gender` joining factors with different levels, coercing to character vectorColumn `ethnicity` joining factors with different levels, coercing to character vectorColumn `capWording` joining factors with different levels, coercing to character vectorColumn `response` joining factors with different levels, coercing to character vector
# skipped trials
d_raw_study1 %>% 
  full_join(d_raw_study2) %>%
  filter((age >= 7 & age < 10) | (age >= 18)) %>%
  filter(!is.na(response), !response %in% c("bail", "skip")) %>%
  count(age_group, subid) %>%
  filter(n != 40) %>%
  mutate(skipped = 40 - n) %>%
  group_by(age_group) %>%
  summarise(total_skipped = sum(skipped))
Joining, by = c("run", "subid", "age", "gender", "ethnicity", "trialNum", "bgColor", "capacity", "capWording", "hoverTime", "rt", "response", "responseNum", "study", "age_group")
Column `run` joining factors with different levels, coercing to character vectorColumn `subid` joining factors with different levels, coercing to character vectorColumn `gender` joining factors with different levels, coercing to character vectorColumn `ethnicity` joining factors with different levels, coercing to character vectorColumn `capWording` joining factors with different levels, coercing to character vectorColumn `response` joining factors with different levels, coercing to character vector
# total mising
d1 %>% 
  full_join(d2) %>%
  filter((age >= 7 & age < 10) | (age >= 18)) %>%
  filter(!is.na(response), !response %in% c("bail", "skip")) %>%
  count(age_group, subid) %>%
  filter(n != 40) %>%
  mutate(missing = 40 - n) %>%
  group_by(age_group) %>%
  summarise(total_missing = sum(missing),
            prop_missing = round(total_missing/(40*200), 3))
Joining, by = c("study", "subid", "character", "age", "gender", "ethnicity", "trialNum", "bgColor", "capacity", "capWording", "hoverTime", "rt", "response", "responseNum", "age_group", "responseNumC")
Column `study` joining factors with different levels, coercing to character vectorColumn `subid` joining factors with different levels, coercing to character vectorColumn `character` joining factors with different levels, coercing to character vectorColumn `gender` joining factors with different levels, coercing to character vectorColumn `ethnicity` joining factors with different levels, coercing to character vectorColumn `capWording` joining factors with different levels, coercing to character vectorColumn `response` joining factors with different levels, coercing to character vector
# make dataframes for s1
# d1_beetle <- makeDRDF("study 1", "beetle")
# d1_robot <- makeDRDF("study 1", "robot")
d1_all <- makeDRDF("study 1", "all")
# make dataframes for follow-up studies to s1
d1b_all <- makeDRDF("study 1b", "all")
d1c_all <- makeDRDF("study 1c", "all")
# make dataframes for study 2
# d2_beetle <- makeDRDF("study 2", "beetle")
# d2_robot <- makeDRDF("study 2", "robot")
d2_all <- makeDRDF("study 2", "all")

back to TOC

Analysis plan

For all studies we conduct exploratory factor analyses using Pearson correlations to find minimum residual solutions.

For each study, we first examine maximal unrotated and rotated solutions. To determine the maximum number of factors to extract, we use the following rule of thumb: With \(p\) observations per participant, we can extract a maximum of \(k\) factors, where \((p-k)*2 > p+k\), i.e., \(k < p/3\). Thus, with 40 mental capacity items, we can extract a maximum of 13 factors.

To determine how many factors to retain, we use the following preset retention criteria, considering the unrotated maximal solution (unless otherwise noted):

We then examine and interpret oblimin-rotated solutions, extracting only the number of factors that meet these criteria.

Adults

Study information:

Demographics

# make demographics tables
demoSampleSize("study 1")
demoDuration("study 1")
demoAge("study 1")
Joining, by = c("character", "min_age", "max_age", "median_age", "mean_age", "sd_age")
Column `character` joining factor and character vector, coercing into character vector
demoGender("study 1")
demoRace("study 1") %>%
  filter(character == "all") %>%
  gather(ethnicity, count, -character) %>%
  mutate(prop = round(count/sum(count), 2)) %>% 
  arrange(desc(prop))
# gender
with(d1 %>%
       distinct(subid, character, gender) %>%
       filter(!is.na(gender)) %>%
       mutate(character = factor(character)),
     table(character, gender)) %>%
  summary()
Number of cases in table: 200 
Number of factors: 2 
Test for independence of all factors:
    Chisq = 1.9863, df = 2, p-value = 0.3704
    Chi-squared approximation may be incorrect
# age
with(d1 %>%
       distinct(subid, character, age),
     t.test(age ~ character))

    Welch Two Sample t-test

data:  age by character
t = 0.26048, df = 192.06, p-value = 0.7948
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.625759  3.424833
sample estimates:
mean in group beetle  mean in group robot 
            33.15464             32.75510 

back to TOC

Exploratory factor analysis

Step 1: Run maximal EFA (without and with rotation)

# examine scree plot
# fa.parallel(d1_all)
# run EFA without rotation with N factors
efa_d1_all_unrotated <- fa(d1_all, 13, rotate = "none",
                           cor = chosenCorType, fm = "minres")
fa.sort(efa_d1_all_unrotated)
Factor Analysis using method =  minres
Call: fa(r = d1_all, nfactors = 13, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   MR4   MR5   MR6   MR7   MR8   MR9  MR10  MR11
happy           0.76  0.00 -0.33 -0.08 -0.22  0.08 -0.15 -0.03 -0.08 -0.04 -0.08
joy             0.76  0.01 -0.39  0.10 -0.17 -0.01 -0.08 -0.07  0.05  0.00 -0.03
love            0.75  0.11 -0.28  0.09 -0.07 -0.09 -0.07 -0.14 -0.03 -0.08  0.00
depressed       0.74  0.04 -0.37  0.04 -0.14  0.04 -0.17 -0.04 -0.21 -0.05 -0.02
fear            0.72 -0.39  0.14  0.03 -0.18  0.07  0.09  0.12 -0.03  0.13 -0.04
safe            0.71 -0.29  0.21 -0.12 -0.03 -0.06  0.04  0.06 -0.03  0.09 -0.13
tired           0.69 -0.34  0.23  0.07 -0.06  0.05  0.06  0.08  0.07 -0.07  0.09
pleasure        0.69 -0.23 -0.07  0.15 -0.15 -0.08 -0.15  0.06  0.16 -0.06  0.21
calm            0.68 -0.17  0.01 -0.08 -0.08  0.04  0.08  0.10 -0.04  0.02 -0.01
pride           0.68  0.18 -0.42  0.08  0.04  0.04  0.01 -0.08 -0.14  0.05 -0.06
desires         0.66 -0.17  0.10 -0.02 -0.03 -0.02  0.35 -0.48  0.13 -0.14 -0.08
angry           0.65 -0.04 -0.11 -0.03  0.05  0.22 -0.02  0.04 -0.10  0.17  0.02
nauseated       0.65 -0.32  0.14  0.08 -0.16  0.05  0.01 -0.06  0.14  0.03  0.03
pain            0.63 -0.52  0.19 -0.01 -0.04  0.11  0.11  0.19  0.05 -0.01  0.09
disrespected    0.63  0.06 -0.35  0.16  0.07  0.07 -0.13 -0.03 -0.07 -0.03 -0.07
guilt           0.62  0.14 -0.41  0.21  0.43  0.14  0.04  0.02  0.08  0.00 -0.03
thoughts        0.55  0.18  0.10 -0.37 -0.01  0.04 -0.04  0.10 -0.09 -0.15  0.19
embarrassed     0.52  0.14 -0.40  0.19  0.48  0.18  0.11  0.11  0.12 -0.03  0.09
odors           0.49 -0.35  0.37  0.05  0.15 -0.09 -0.03  0.10  0.07  0.01 -0.03
beliefs         0.48  0.40 -0.16 -0.14  0.04 -0.38  0.18  0.09  0.07  0.04 -0.06
self_aware      0.46  0.18  0.22 -0.30  0.09  0.00  0.12  0.13 -0.20 -0.28 -0.21
personality     0.44  0.36 -0.19 -0.13 -0.03 -0.27  0.01  0.00  0.24  0.20 -0.06
self_restraint  0.43  0.35 -0.05 -0.15  0.04 -0.19 -0.08  0.07  0.00  0.02  0.17
goal            0.41  0.21  0.19 -0.11  0.07 -0.11  0.18 -0.08  0.02 -0.03  0.07
choices         0.37  0.34  0.36 -0.20  0.06  0.09 -0.25 -0.20  0.12 -0.05  0.17
computations   -0.33  0.82 -0.07  0.14 -0.03  0.00 -0.02  0.04  0.03  0.00  0.03
recognizing     0.10  0.76  0.12  0.13 -0.21  0.15  0.11  0.11  0.15 -0.02  0.00
hungry          0.55 -0.71  0.22 -0.03  0.08 -0.02  0.06  0.02  0.03  0.03  0.05
remembering     0.14  0.66  0.16  0.10 -0.15  0.13  0.01 -0.05  0.03 -0.15  0.04
communicating   0.11  0.62  0.18  0.14 -0.18  0.30  0.11  0.18  0.15 -0.05 -0.08
intentions      0.19  0.62  0.02 -0.16  0.01  0.07  0.26  0.00 -0.20  0.00  0.09
morality        0.31  0.50 -0.13  0.02 -0.07 -0.19  0.08  0.05 -0.04  0.00  0.18
reasoning       0.34  0.44  0.31 -0.16  0.01  0.21 -0.11  0.01  0.08  0.20 -0.21
emo_recog       0.37  0.39 -0.10 -0.10  0.01 -0.27 -0.09  0.10  0.04  0.08 -0.14
seeing          0.33  0.15  0.50  0.28  0.08 -0.03 -0.07 -0.01 -0.11 -0.01  0.07
depth           0.26  0.27  0.48  0.28  0.12 -0.09 -0.16 -0.09  0.04 -0.08 -0.10
temperature     0.30  0.19  0.46  0.40  0.05 -0.22  0.04  0.00 -0.26  0.12  0.09
conscious       0.44  0.10  0.44 -0.11  0.17 -0.11 -0.24  0.06  0.08 -0.19 -0.15
sounds          0.27  0.20  0.42  0.38 -0.06 -0.02  0.06 -0.07 -0.11  0.12 -0.07
free_will       0.31  0.30  0.32 -0.40  0.15  0.22 -0.07 -0.19 -0.05  0.27  0.10
                MR12  MR13   h2   u2 com
happy          -0.04 -0.08 0.80 0.20 1.8
joy             0.09 -0.01 0.79 0.21 1.8
love            0.08  0.07 0.71 0.29 1.6
depressed       0.06 -0.03 0.79 0.21 2.0
fear           -0.16  0.15 0.82 0.18 2.3
safe           -0.04  0.07 0.68 0.32 1.8
tired          -0.11 -0.05 0.70 0.30 2.0
pleasure        0.09  0.18 0.72 0.28 2.3
calm            0.05 -0.07 0.54 0.46 1.3
pride          -0.16  0.01 0.74 0.26 2.2
desires         0.02 -0.07 0.87 0.13 2.9
angry          -0.20 -0.09 0.58 0.42 1.8
nauseated       0.04  0.05 0.61 0.39 2.0
pain           -0.01 -0.14 0.80 0.20 2.7
disrespected   -0.02  0.02 0.59 0.41 2.0
guilt          -0.03 -0.05 0.84 0.16 3.3
thoughts        0.09 -0.05 0.57 0.43 2.9
embarrassed     0.12  0.07 0.82 0.18 4.3
odors           0.11  0.05 0.56 0.44 3.4
beliefs        -0.09 -0.04 0.64 0.36 4.0
self_aware      0.15 -0.07 0.60 0.40 5.6
personality     0.09 -0.17 0.59 0.41 5.2
self_restraint -0.04 -0.14 0.43 0.57 3.5
goal           -0.14  0.15 0.36 0.64 4.0
choices        -0.07 -0.05 0.59 0.41 6.1
computations   -0.06 -0.03 0.81 0.19 1.4
recognizing    -0.02 -0.12 0.75 0.25 1.7
hungry          0.07  0.01 0.88 0.12 2.2
remembering     0.09  0.10 0.58 0.42 1.7
communicating  -0.01 -0.03 0.65 0.35 2.6
intentions     -0.01  0.18 0.60 0.40 2.3
morality       -0.10  0.10 0.46 0.54 2.9
reasoning       0.09  0.12 0.60 0.40 5.4
emo_recog       0.14  0.11 0.46 0.54 4.3
seeing          0.09 -0.08 0.50 0.50 3.1
depth          -0.13 -0.02 0.53 0.47 4.1
temperature     0.06 -0.09 0.65 0.35 4.8
conscious      -0.21  0.05 0.63 0.37 4.6
sounds          0.08  0.01 0.48 0.52 4.0
free_will       0.08  0.00 0.65 0.35 6.8

                        MR1  MR2  MR3  MR4  MR5  MR6  MR7  MR8  MR9 MR10 MR11 MR12
SS loadings           11.03 5.51 3.15 1.29 0.87 0.84 0.64 0.56 0.51 0.46 0.43 0.38
Proportion Var         0.28 0.14 0.08 0.03 0.02 0.02 0.02 0.01 0.01 0.01 0.01 0.01
Cumulative Var         0.28 0.41 0.49 0.52 0.55 0.57 0.58 0.60 0.61 0.62 0.63 0.64
Proportion Explained   0.42 0.21 0.12 0.05 0.03 0.03 0.02 0.02 0.02 0.02 0.02 0.01
Cumulative Proportion  0.42 0.64 0.76 0.81 0.84 0.87 0.90 0.92 0.94 0.96 0.97 0.99
                      MR13
SS loadings           0.32
Proportion Var        0.01
Cumulative Var        0.65
Proportion Explained  0.01
Cumulative Proportion 1.00

Mean item complexity =  3.1
Test of the hypothesis that 13 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  27.45 with Chi Square of  5073.12
The degrees of freedom for the model are 338  and the objective function was  2.41 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic number of observations is  196 with the empirical chi square  93.35  with prob <  1 
The total number of observations was  200  with Likelihood Chi Square =  424.01  with prob <  0.001 

Tucker Lewis Index of factoring reliability =  0.951
RMSEA index =  0.046  and the 90 % confidence intervals are  0.024 0.046
BIC =  -1366.82
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6  MR7
Correlation of scores with factors             0.99 0.98 0.95 0.88 0.89 0.84 0.83
Multiple R square of scores with factors       0.98 0.95 0.91 0.77 0.79 0.70 0.70
Minimum correlation of possible factor scores  0.95 0.90 0.82 0.55 0.59 0.40 0.39
                                                MR8  MR9 MR10 MR11 MR12 MR13
Correlation of scores with factors             0.85 0.78 0.75 0.73 0.74 0.71
Multiple R square of scores with factors       0.73 0.61 0.57 0.54 0.54 0.50
Minimum correlation of possible factor scores  0.45 0.23 0.14 0.08 0.08 0.00
# count factors with eigenvalues > 1 and variance explained > 5%
efa_d1_all_unrotated_nfactors <- efa_d1_all_unrotated_eigenvalues %>%
  filter(SS.loadings > 1, Proportion.Explained > 0.05) %>%
  count() %>%
  as.numeric()
efa_d1_all_unrotated_nfactors
[1] 3
efa_d1_rotatedN <- fa(d1_all, efa_d1_all_unrotated_nfactors, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
# check that each of these factors is the dominant factor for at least one mental capacity item
efa_d1_rotatedN_loadings <- fa.sort(loadings(efa_d1_rotatedN)[]) %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  mutate(loading_abs = abs(loading)) %>%
  group_by(capacity) %>%
  top_n(1, loading_abs) %>%
  ungroup()
efa_d1_rotatedN_loadings
# drop any factors where n < 1
efa_d1_rotatedN_loadings %>% 
  count(factor) %>% 
  filter(n > 0)
# set number of factors to extract
nfactors_d1_all <- efa_d1_rotatedN_loadings %>% 
  count(factor) %>% 
  filter(n > 0) %>%
  nrow()
nfactors_d1_all
[1] 3

Step 2: Run EFA with oblimin rotation

# run EFA with rotation with N factors
efa_d1_rotatedN <- fa(d1_all, nfactors_d1_all, 
                          rotate = chosenRotType, cor = chosenCorType, fm = "minres")
fa.sort(efa_d1_rotatedN)
Factor Analysis using method =  minres
Call: fa(r = d1_all, nfactors = nfactors_d1_all, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   h2   u2 com
pride           0.85 -0.06 -0.04 0.68 0.32 1.0
joy             0.84  0.12 -0.09 0.73 0.27 1.1
depressed       0.81  0.10 -0.06 0.68 0.32 1.0
happy           0.78  0.17 -0.04 0.68 0.32 1.1
love            0.76  0.10  0.06 0.66 0.34 1.0
guilt           0.75 -0.03 -0.05 0.53 0.47 1.0
disrespected    0.72  0.05 -0.06 0.53 0.47 1.0
embarrassed     0.66 -0.06 -0.07 0.39 0.61 1.0
beliefs         0.53 -0.17  0.24 0.40 0.60 1.6
personality     0.52 -0.18  0.19 0.34 0.66 1.5
angry           0.50  0.27  0.09 0.43 0.57 1.6
morality        0.43 -0.32  0.28 0.36 0.64 2.6
emo_recog       0.41 -0.18  0.26 0.29 0.71 2.1
self_restraint  0.40 -0.10  0.29 0.30 0.70 2.0
hungry          0.00  0.93 -0.06 0.87 0.13 1.0
computations    0.04 -0.83  0.33 0.80 0.20 1.3
pain            0.13  0.79  0.05 0.70 0.30 1.1
tired           0.17  0.70  0.20 0.64 0.36 1.3
fear            0.26  0.70  0.11 0.68 0.32 1.3
odors          -0.08  0.69  0.25 0.50 0.50 1.3
safe            0.22  0.65  0.22 0.63 0.37 1.5
nauseated       0.23  0.62  0.13 0.54 0.46 1.4
desires         0.31  0.45  0.17 0.44 0.56 2.1
calm            0.39  0.45  0.12 0.50 0.50 2.1
pleasure        0.44  0.44  0.02 0.51 0.49 2.0
depth          -0.17  0.15  0.62 0.35 0.65 1.3
reasoning       0.07 -0.02  0.60 0.39 0.61 1.0
seeing         -0.17  0.29  0.59 0.37 0.63 1.6
choices         0.03  0.08  0.59 0.36 0.64 1.0
recognizing     0.14 -0.48  0.57 0.59 0.41 2.1
remembering     0.11 -0.37  0.56 0.48 0.52 1.8
temperature    -0.13  0.21  0.55 0.30 0.70 1.4
conscious      -0.05  0.34  0.54 0.37 0.63 1.7
communicating   0.07 -0.33  0.53 0.41 0.59 1.7
sounds         -0.13  0.18  0.53 0.27 0.73 1.3
free_will       0.02  0.06  0.49 0.25 0.75 1.0
intentions      0.25 -0.38  0.43 0.41 0.59 2.6
goal            0.15  0.12  0.41 0.25 0.75 1.4
self_aware      0.15  0.18  0.40 0.27 0.73 1.7
thoughts        0.31  0.16  0.34 0.33 0.67 2.4

                       MR1  MR2  MR3
SS loadings           7.56 6.63 5.04
Proportion Var        0.19 0.17 0.13
Cumulative Var        0.19 0.35 0.48
Proportion Explained  0.39 0.34 0.26
Cumulative Proportion 0.39 0.74 1.00

 With factor correlations of 
     MR1   MR2   MR3
MR1 1.00  0.28  0.30
MR2 0.28  1.00 -0.01
MR3 0.30 -0.01  1.00

Mean item complexity =  1.5
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  27.45 with Chi Square of  5073.12
The degrees of freedom for the model are 663  and the objective function was  6.67 

The root mean square of the residuals (RMSR) is  0.05 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  196 with the empirical chi square  729.79  with prob <  0.036 
The total number of observations was  200  with Likelihood Chi Square =  1219.34  with prob <  2.1e-35 

Tucker Lewis Index of factoring reliability =  0.846
RMSEA index =  0.071  and the 90 % confidence intervals are  0.059 NA
BIC =  -2293.44
Fit based upon off diagonal values = 0.98
Measures of factor score adequacy             
                                                MR1  MR2  MR3
Correlation of scores with factors             0.97 0.98 0.95
Multiple R square of scores with factors       0.95 0.96 0.89
Minimum correlation of possible factor scores  0.89 0.92 0.79
# get loadings for each factor
efa_d1_rotatedN_loadings <- loadings(efa_d1_rotatedN)[] %>%
  data.frame() %>% 
  rownames_to_column(var = "capacity")

back to TOC

Factor loadings table

data.frame(loadings(fa.sort(efa_d1_rotatedN))[]) %>%
  rownames_to_column("capacity") %>%
  mutate_at(vars(starts_with("M")), funs(round2))

Children (7-9y)

Study information:

Demographics

# make demographics tables
demoSampleSize("study 2")
demoDuration("study 2")
demoAge("study 2")
Joining, by = c("character", "min_age", "max_age", "median_age", "mean_age", "sd_age")
Column `character` joining factor and character vector, coercing into character vector
demoGender("study 2")
demoRace("study 2") %>%
  filter(character == "all") %>%
  gather(ethnicity, count, -character) %>%
  mutate(prop = round(count/sum(count), 2)) %>% 
  arrange(desc(prop))
# gender
with(d2 %>%
       distinct(subid, character, gender) %>%
       filter(!is.na(gender)) %>%
       mutate(character = factor(character)),
     table(character, gender)) %>%
  summary()
Number of cases in table: 197 
Number of factors: 2 
Test for independence of all factors:
    Chisq = 0.016177, df = 1, p-value = 0.8988
# age
with(d2 %>%
       distinct(subid, character, age),
     t.test(age ~ character))

    Welch Two Sample t-test

data:  age by character
t = 0.48254, df = 197.76, p-value = 0.63
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.1769700  0.2916335
sample estimates:
mean in group beetle  mean in group robot 
            8.381464             8.324132 

back to TOC

Exploratory factor analysis

Step 1: Run maximal EFA (without and with rotation)

# examine scree plot
# fa.parallel(d2_all)
# run EFA without rotation with N factors
efa_d2_all_unrotated <- fa(d2_all, 13, rotate = "none",
                           cor = chosenCorType, fm = "minres")
fa.sort(efa_d2_all_unrotated)
Factor Analysis using method =  minres
Call: fa(r = d2_all, nfactors = 13, rotate = "none", fm = "minres", 
    cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3   MR4   MR5   MR6   MR7   MR8   MR9  MR10  MR11
happy           0.72  0.09 -0.20  0.18 -0.20 -0.06 -0.01 -0.13  0.09 -0.03  0.12
joy             0.70  0.00 -0.26  0.10 -0.18 -0.10 -0.03 -0.05  0.06 -0.01  0.05
depressed       0.69 -0.11 -0.13  0.05 -0.06 -0.13  0.12  0.06  0.21 -0.09 -0.15
disrespected    0.69  0.00 -0.11 -0.07 -0.03 -0.02  0.16 -0.16 -0.09  0.03  0.10
pride           0.68  0.14 -0.31  0.06 -0.05 -0.02  0.01 -0.04 -0.01 -0.04 -0.03
love            0.60  0.03 -0.20  0.11  0.03 -0.11  0.09 -0.19 -0.05  0.05  0.07
pleasure        0.60  0.04 -0.18  0.10 -0.23 -0.17 -0.31  0.04  0.01 -0.04  0.08
safe            0.58 -0.08  0.23  0.06 -0.06 -0.06 -0.19  0.16 -0.24  0.00 -0.10
guilt           0.58  0.07 -0.18  0.13  0.25  0.19 -0.07 -0.10 -0.07 -0.08  0.14
thoughts        0.57  0.01  0.18 -0.05 -0.11 -0.16 -0.03  0.03 -0.09  0.03 -0.03
angry           0.57 -0.17 -0.04 -0.07  0.05  0.16  0.11  0.06 -0.04  0.01 -0.04
fear            0.55 -0.37  0.11  0.11 -0.08  0.03  0.01  0.17  0.09  0.03 -0.06
calm            0.55 -0.07  0.01  0.02 -0.10 -0.09 -0.14  0.05 -0.01 -0.18  0.10
personality     0.54  0.29 -0.01 -0.12  0.20  0.12  0.01  0.18 -0.01  0.06 -0.09
beliefs         0.54  0.23 -0.07 -0.09  0.05  0.24 -0.12 -0.05 -0.01  0.13  0.06
embarrassed     0.53  0.03 -0.30  0.10  0.22  0.34  0.23 -0.06 -0.01 -0.03  0.02
desires         0.52 -0.19 -0.03 -0.01 -0.08  0.21 -0.07 -0.04  0.02  0.10  0.03
free_will       0.49  0.00  0.32 -0.22 -0.09  0.11 -0.21 -0.18  0.08  0.03 -0.02
morality        0.44  0.37 -0.13 -0.08  0.21 -0.26 -0.05  0.26 -0.18  0.33  0.07
choices         0.43  0.05  0.26 -0.38 -0.07  0.20 -0.05 -0.13  0.11  0.05 -0.15
tired           0.39 -0.35  0.07  0.11  0.16 -0.16  0.24  0.06  0.12 -0.07 -0.11
goal            0.35  0.31 -0.03 -0.09 -0.06  0.10 -0.11  0.22  0.02 -0.18 -0.25
computations   -0.01  0.80 -0.04  0.02  0.08  0.10 -0.09  0.03  0.10 -0.11  0.08
hungry          0.38 -0.77  0.22  0.02  0.14 -0.04  0.01 -0.08  0.06  0.05  0.00
pain            0.45 -0.64  0.21 -0.06  0.07 -0.09 -0.05 -0.04 -0.01  0.10 -0.01
remembering     0.06  0.58  0.17  0.13 -0.05  0.00  0.01 -0.17  0.19  0.28 -0.24
odors           0.15 -0.53  0.38  0.06  0.09  0.12 -0.06  0.16  0.06  0.03  0.19
emo_recog       0.34  0.50 -0.05  0.09  0.11 -0.07  0.22  0.14 -0.09  0.07 -0.02
nauseated       0.30 -0.43  0.06  0.11  0.27  0.05  0.00  0.07  0.16  0.06 -0.10
intentions      0.35  0.40  0.15 -0.24  0.11  0.03  0.02 -0.12  0.09 -0.14  0.08
recognizing     0.20  0.32  0.13  0.10  0.11  0.00 -0.11  0.21  0.06  0.00  0.04
communicating   0.09  0.30  0.16  0.30 -0.17  0.03  0.19  0.11  0.29  0.04  0.04
conscious       0.36  0.08  0.48  0.21 -0.14  0.01  0.16 -0.12 -0.27 -0.14 -0.04
self_aware      0.27  0.21  0.46 -0.03 -0.10  0.09  0.23  0.00 -0.31 -0.10 -0.09
temperature    -0.05  0.34  0.41  0.31  0.34 -0.26 -0.15 -0.23  0.08 -0.15 -0.09
sounds         -0.07  0.10  0.40  0.10 -0.18  0.23  0.08  0.23  0.14 -0.08  0.25
depth           0.14  0.22  0.36  0.12  0.34  0.02 -0.14 -0.07 -0.02  0.02  0.17
reasoning       0.23  0.28  0.36  0.05 -0.16 -0.01 -0.05  0.01  0.05  0.12 -0.06
self_restraint  0.34  0.19  0.15 -0.56  0.11 -0.33  0.20  0.05  0.17 -0.16  0.15
seeing         -0.07  0.13  0.26 -0.03 -0.19 -0.08  0.19 -0.08  0.02  0.27  0.20
                MR12  MR13   h2   u2 com
happy           0.05 -0.09 0.69 0.31 1.8
joy             0.11  0.02 0.62 0.38 1.6
depressed      -0.01  0.00 0.63 0.37 1.7
disrespected    0.09  0.08 0.58 0.42 1.4
pride           0.01 -0.15 0.61 0.39 1.7
love            0.03  0.14 0.50 0.50 1.9
pleasure       -0.09 -0.02 0.60 0.40 2.5
safe            0.09 -0.22 0.59 0.41 2.8
guilt          -0.05 -0.03 0.53 0.47 2.4
thoughts        0.15  0.08 0.44 0.56 1.8
angry           0.02 -0.16 0.44 0.56 1.7
fear           -0.25 -0.09 0.58 0.42 2.9
calm           -0.02  0.10 0.40 0.60 1.8
personality     0.00  0.09 0.50 0.50 2.6
beliefs         0.08  0.21 0.50 0.50 2.8
embarrassed    -0.13 -0.05 0.63 0.37 3.7
desires        -0.17  0.15 0.42 0.58 2.3
free_will      -0.03 -0.10 0.51 0.49 3.5
morality        0.03 -0.09 0.69 0.31 5.9
choices         0.16 -0.09 0.54 0.46 4.6
tired           0.12  0.05 0.45 0.55 4.7
goal           -0.04  0.14 0.42 0.58 5.4
computations    0.10  0.00 0.71 0.29 1.2
hungry          0.03  0.01 0.81 0.19 1.8
pain            0.06  0.08 0.70 0.30 2.3
remembering    -0.03 -0.08 0.59 0.41 2.8
odors           0.09 -0.06 0.55 0.45 3.0
emo_recog       0.13  0.05 0.49 0.51 3.1
nauseated       0.02  0.08 0.42 0.58 3.6
intentions      0.05 -0.12 0.43 0.57 4.2
recognizing    -0.14  0.05 0.26 0.74 4.7
communicating  -0.02 -0.12 0.40 0.60 5.9
conscious      -0.12  0.01 0.58 0.42 4.2
self_aware     -0.03  0.01 0.52 0.48 4.2
temperature     0.08  0.04 0.68 0.32 6.4
sounds          0.23  0.06 0.47 0.53 5.6
depth          -0.15 -0.07 0.41 0.59 4.8
reasoning      -0.11  0.22 0.37 0.63 4.8
self_restraint -0.19  0.01 0.76 0.24 4.5
seeing         -0.08  0.02 0.30 0.70 6.0

                       MR1  MR2  MR3  MR4  MR5  MR6  MR7  MR8  MR9 MR10 MR11 MR12
SS loadings           8.25 4.13 2.18 1.05 0.96 0.84 0.73 0.66 0.62 0.54 0.52 0.44
Proportion Var        0.21 0.10 0.05 0.03 0.02 0.02 0.02 0.02 0.02 0.01 0.01 0.01
Cumulative Var        0.21 0.31 0.36 0.39 0.41 0.44 0.45 0.47 0.49 0.50 0.51 0.52
Proportion Explained  0.39 0.19 0.10 0.05 0.05 0.04 0.03 0.03 0.03 0.03 0.02 0.02
Cumulative Proportion 0.39 0.58 0.68 0.73 0.78 0.82 0.85 0.88 0.91 0.94 0.96 0.98
                      MR13
SS loadings           0.40
Proportion Var        0.01
Cumulative Var        0.53
Proportion Explained  0.02
Cumulative Proportion 1.00

Mean item complexity =  3.4
Test of the hypothesis that 13 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  17.08 with Chi Square of  3157.08
The degrees of freedom for the model are 338  and the objective function was  1.79 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic number of observations is  198 with the empirical chi square  142.71  with prob <  1 
The total number of observations was  200  with Likelihood Chi Square =  314.7  with prob <  0.81 

Tucker Lewis Index of factoring reliability =  1.024
RMSEA index =  0.016  and the 90 % confidence intervals are  0 0.018
BIC =  -1476.13
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy             
                                                MR1  MR2  MR3  MR4  MR5  MR6  MR7
Correlation of scores with factors             0.98 0.96 0.91 0.86 0.83 0.83 0.79
Multiple R square of scores with factors       0.95 0.93 0.83 0.74 0.69 0.68 0.62
Minimum correlation of possible factor scores  0.90 0.86 0.67 0.48 0.38 0.36 0.23
                                                MR8  MR9 MR10 MR11 MR12  MR13
Correlation of scores with factors             0.77 0.77 0.75 0.73 0.71  0.67
Multiple R square of scores with factors       0.60 0.59 0.56 0.53 0.50  0.45
Minimum correlation of possible factor scores  0.19 0.18 0.12 0.06 0.00 -0.10
# count factors with eigenvalues > 1 and variance explained > 5%
efa_d2_all_unrotated_nfactors <- efa_d2_all_unrotated_eigenvalues %>%
  filter(SS.loadings > 1, Proportion.Explained > 0.05) %>%
  count() %>%
  as.numeric()
efa_d2_all_unrotated_nfactors
[1] 3
efa_d2_rotatedN <- fa(d2_all, efa_d2_all_unrotated_nfactors, rotate = chosenRotType,
                           cor = chosenCorType, fm = "minres")
# check that each of these factors is the dominant factor for at least one mental capacity item
efa_d2_rotatedN_loadings <- fa.sort(loadings(efa_d2_rotatedN)[]) %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  mutate(loading_abs = abs(loading)) %>%
  group_by(capacity) %>%
  top_n(1, loading_abs) %>%
  ungroup()
efa_d2_rotatedN_loadings
# drop any factors where n < 1
efa_d2_rotatedN_loadings %>% 
  count(factor) %>% 
  filter(n > 0)
# set number of factors to extract
nfactors_d2_all <- efa_d2_rotatedN_loadings %>% 
  count(factor) %>% 
  filter(n > 0) %>%
  nrow()
nfactors_d2_all
[1] 3

Step 2: Run EFA with oblimin rotation

# run EFA with rotation with N factors
efa_d2_rotatedN <- fa(d2_all, nfactors_d2_all, 
                          rotate = chosenRotType, cor = chosenCorType, fm = "minres")
fa.sort(efa_d2_rotatedN)
Factor Analysis using method =  minres
Call: fa(r = d2_all, nfactors = nfactors_d2_all, rotate = chosenRotType, 
    fm = "minres", cor = chosenCorType)
Standardized loadings (pattern matrix) based upon correlation matrix
                 MR1   MR2   MR3    h2   u2 com
pride           0.81 -0.11 -0.08 0.594 0.41 1.1
joy             0.76  0.05 -0.07 0.555 0.44 1.0
happy           0.74  0.00  0.02 0.555 0.44 1.0
disrespected    0.65  0.11  0.08 0.488 0.51 1.1
depressed       0.65  0.20  0.02 0.504 0.50 1.2
love            0.64  0.03 -0.03 0.403 0.60 1.0
embarrassed     0.62 -0.02 -0.12 0.346 0.65 1.1
pleasure        0.61  0.03  0.00 0.375 0.63 1.0
guilt           0.60 -0.01  0.01 0.358 0.64 1.0
beliefs         0.51 -0.12  0.16 0.336 0.66 1.3
personality     0.49 -0.15  0.24 0.372 0.63 1.7
angry           0.48  0.26  0.05 0.356 0.64 1.6
morality        0.47 -0.26  0.13 0.306 0.69 1.8
calm            0.44  0.17  0.12 0.299 0.70 1.5
desires         0.42  0.27  0.04 0.301 0.70 1.7
thoughts        0.35  0.17  0.34 0.364 0.64 2.5
goal            0.35 -0.21  0.17 0.212 0.79 2.2
hungry          0.06  0.87  0.04 0.786 0.21 1.0
pain            0.15  0.77  0.10 0.662 0.34 1.1
computations    0.12 -0.76  0.25 0.650 0.35 1.3
odors          -0.20  0.64  0.22 0.425 0.57 1.4
fear            0.33  0.49  0.12 0.441 0.56 1.9
nauseated       0.15  0.47 -0.02 0.270 0.73 1.2
remembering     0.02 -0.44  0.36 0.333 0.67 1.9
tired           0.23  0.42  0.04 0.266 0.73 1.6
emo_recog       0.38 -0.40  0.22 0.360 0.64 2.6
self_aware     -0.05  0.02  0.57 0.303 0.70 1.0
conscious       0.00  0.16  0.56 0.331 0.67 1.2
reasoning      -0.02 -0.08  0.51 0.265 0.73 1.0
depth          -0.09 -0.04  0.45 0.182 0.82 1.1
free_will       0.19  0.21  0.43 0.331 0.67 1.9
temperature    -0.23 -0.17  0.43 0.212 0.79 1.9
sounds         -0.28  0.03  0.37 0.144 0.86 1.9
intentions      0.24 -0.24  0.37 0.293 0.71 2.5
choices         0.19  0.13  0.36 0.231 0.77 1.8
safe            0.31  0.27  0.34 0.380 0.62 2.9
recognizing     0.12 -0.20  0.29 0.154 0.85 2.1
seeing         -0.21 -0.04  0.27 0.083 0.92 1.9
communicating   0.01 -0.20  0.26 0.111 0.89 1.9
self_restraint  0.21 -0.04  0.26 0.144 0.86 2.0

                       MR1  MR2  MR3
SS loadings           6.84 4.15 3.09
Proportion Var        0.17 0.10 0.08
Cumulative Var        0.17 0.27 0.35
Proportion Explained  0.49 0.29 0.22
Cumulative Proportion 0.49 0.78 1.00

 With factor correlations of 
     MR1   MR2   MR3
MR1 1.00  0.16  0.34
MR2 0.16  1.00 -0.02
MR3 0.34 -0.02  1.00

Mean item complexity =  1.6
Test of the hypothesis that 3 factors are sufficient.

The degrees of freedom for the null model are  780  and the objective function was  17.08 with Chi Square of  3157.08
The degrees of freedom for the model are 663  and the objective function was  4.79 

The root mean square of the residuals (RMSR) is  0.05 
The df corrected root mean square of the residuals is  0.05 

The harmonic number of observations is  198 with the empirical chi square  788.89  with prob <  0.00052 
The total number of observations was  200  with Likelihood Chi Square =  874.92  with prob <  5.4e-08 

Tucker Lewis Index of factoring reliability =  0.894
RMSEA index =  0.047  and the 90 % confidence intervals are  0.032 0.047
BIC =  -2637.86
Fit based upon off diagonal values = 0.95
Measures of factor score adequacy             
                                                MR1  MR2  MR3
Correlation of scores with factors             0.96 0.96 0.90
Multiple R square of scores with factors       0.92 0.92 0.81
Minimum correlation of possible factor scores  0.85 0.84 0.62
# get loadings for each factor
efa_d2_rotatedN_loadings <- loadings(efa_d2_rotatedN)[] %>%
  data.frame() %>% 
  rownames_to_column(var = "capacity")

back to TOC

Factor loadings table

data.frame(loadings(fa.sort(efa_d2_rotatedN))[]) %>%
  rownames_to_column("capacity") %>%
  mutate_at(vars(starts_with("M")), funs(round2))

Big factor loadings table

# manually set 3 factors
order_s1_manual <- loadings(fa.sort(fa(d1_all, nfactors = 3,
                                       rotate = chosenRotType, cor = chosenCorType)))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rownames_to_column(var = "order1_manual") %>%
  rename(s1_heart = MR1, s1_body = MR2, s1_mind = MR3)
order_s1 <- loadings(fa.sort(efa_d1_rotatedN))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rownames_to_column(var = "order1") %>%
  rename(s1_heart = MR1, s1_body = MR2, s1_mind = MR3)
order_s2 <- loadings(fa.sort(efa_d2_rotatedN))[] %>%
  data.frame() %>%
  rownames_to_column(var = "capacity") %>%
  rename(s2_body = MR2, s2_heart = MR1, s2_mind = MR3)
bigTable <- order_s1 %>% 
  # order_s1_manual %>% # could substitute
  full_join(order_s2) %>%
  mutate_at(vars(starts_with("s")), funs(round2)) %>%
  select(order1, # could subistitute order_s1
  # select(order1_manual, # could subistitute order_s1
         capacity, ends_with("heart"), ends_with("body"), ends_with("mind")) 
Joining, by = "capacity"
bigTable

Figures

3D scatterplots

Factor loadings for the 40 mental capacities on the three rotated factors in Study 1. Items are colored by their dominant factor loading: Items that loaded most strongly on the body factor (bodily states and will) are in red; items that loaded most strongly on the heart factor (social-emotional experiences and morality) are in blue; and items that loaded most strongly on the mind factor (perceptual-cognitive abilities and goal pursuit) are in green.

Study 1 (adults)

# set up labels for plot (shortened version of mental capacity items)
wording_s1 <- loadings(efa_d1_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  select(item) %>%
  mutate(wording = factor(
    recode(item,
           happy = "feel happy",
           depressed = "feel sad",
           fear = "feel scared",
           angry = "get angry",
           calm = "feel calm",
           sounds = "hear sounds",
           seeing = "see things",
           temperature = "sense temperatures",
           odors = "smell things",
           depth = "sense whether something is close by or far away",
           computations = "do math",
           thoughts = "have thoughts",
           reasoning = "figure out how to do things",
           remembering = "remember things",
           beliefs = "have beliefs, like when you think something is true",
           hungry = "get hungry",
           tired = "feel tired",
           pain = "feel pain",
           nauseated = "feel sick, like when you feel like you might throw up",
           safe = "feel safe",
           love = "feel love",
           recognizing = "recognize somebody else",
           communicating = "communicate with somebody else",
           guilt = "feel guilty",
           disrespected = "get hurt feelings",
           free_will = "decide what to do",
           choices = "make choices",
           self_restraint = "have self-control, like when you stop yourself from doing something you shouldn't do",
           intentions = "make plans",
           goal = "have goals, like when you're working hard to do something or make something happen",
           conscious = "be aware of things",
           self_aware = "be aware of itself",
           desires = "have desires, like when you really want something",
           embarrassed = "feel embarrassed",
           emo_recog = "understand how somebody else is feeling",
           joy = "feel joy",
           morality = "know what's nice and what's mean",
           personality = "have a personality, like when someone is shy and somebody else is silly",
           pleasure = "feel pleasure, like when something feels really good",
           pride = "feel proud"))) %>%
    mutate(short = factor(
      recode(item,
             happy = "happy",
             depressed = "sad",
           fear = "scared",
           angry = "angry",
           calm = "calm",
           sounds = "hear",
           seeing = "see",
           temperature = "temperatures",
           odors = "smell",
           depth = "depth",
           computations = "math",
           thoughts = "thoughts",
           reasoning = "figure out",
           remembering = "remember",
           beliefs = "beliefs",
           hungry = "hungry",
           tired = "tired",
           pain = "pain",
           nauseated = "sick",
           safe = "safe",
           love = "love",
           recognizing = "recognize",
           communicating = "communicate",
           guilt = "guilty",
           disrespected = "hurt feelings",
           free_will = "decide",
           choices = "choices",
           self_restraint = "self-control",
           intentions = "plans",
           goal = "goals",
           conscious = "aware",
           self_aware = "self-aware",
           desires = "desires",
           embarrassed = "embarrassed",
           emo_recog = "empathy",
           joy = "joy",
           morality = "morality",
           personality = "personality",
           pleasure = "pleasure",
           pride = "pride")))
# make dataframe for plotting
scatter_plotting <- loadings(efa_d1_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  rename(HEART = MR1,
         BODY = MR2,
         MIND = MR3) %>%
  full_join(wording_s1) %>%
  mutate(dominant = factor(
    ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), "BODY",
           ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), "HEART",
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), "MIND",
                         NA)))),
    size = ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), abs(BODY),
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), abs(HEART),
                         ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), abs(MIND),
                                NA))),
    color = ifelse(dominant == "BODY", "#E41A1C",
                   ifelse(dominant == "HEART", "#377EB8",
                          ifelse(dominant == "MIND", "#4DAF4A",
                                 NA))))
Joining, by = "item"
# plot!
figS1 <- plot_ly(scatter_plotting, x = ~HEART, y = ~BODY, z = ~MIND,
             type = "scatter3d",
             color = ~dominant, colors = c("#E41A1C", "#377EB8", "#4DAF4A"),
             marker = list(size = 4),
             text = ~short,
             textfont = list(size = 15),
             mode = "text+markers",
             showlegend = TRUE)
figS1

Study 2 (7-9yo)

# set up labels for plot (shortened version of mental capacity items)
wording_s2 <- loadings(efa_d2_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  select(item) %>%
  mutate(wording = factor(
    recode(item,
           happy = "feel happy",
           depressed = "feel sad",
           fear = "feel scared",
           angry = "get angry",
           calm = "feel calm",
           sounds = "hear sounds",
           seeing = "see things",
           temperature = "sense temperatures",
           odors = "smell things",
           depth = "sense whether something is close by or far away",
           computations = "do math",
           thoughts = "have thoughts",
           reasoning = "figure out how to do things",
           remembering = "remember things",
           beliefs = "have beliefs, like when you think something is true",
           hungry = "get hungry",
           tired = "feel tired",
           pain = "feel pain",
           nauseated = "feel sick, like when you feel like you might throw up",
           safe = "feel safe",
           love = "feel love",
           recognizing = "recognize somebody else",
           communicating = "communicate with somebody else",
           guilt = "feel guilty",
           disrespected = "get hurt feelings",
           free_will = "decide what to do",
           choices = "make choices",
           self_restraint = "have self-control, like when you stop yourself from doing something you shouldn't do",
           intentions = "make plans",
           goal = "have goals, like when you're working hard to do something or make something happen",
           conscious = "be aware of things",
           self_aware = "be aware of itself",
           desires = "have desires, like when you really want something",
           embarrassed = "feel embarrassed",
           emo_recog = "understand how somebody else is feeling",
           joy = "feel joy",
           morality = "know what's nice and what's mean",
           personality = "have a personality, like when someone is shy and somebody else is silly",
           pleasure = "feel pleasure, like when something feels really good",
           pride = "feel proud"))) %>%
    mutate(short = factor(
      recode(item,
             happy = "happy",
             depressed = "sad",
           fear = "scared",
           angry = "angry",
           calm = "calm",
           sounds = "hear",
           seeing = "see",
           temperature = "temperatures",
           odors = "smell",
           depth = "depth",
           computations = "math",
           thoughts = "thoughts",
           reasoning = "figure out",
           remembering = "remember",
           beliefs = "beliefs",
           hungry = "hungry",
           tired = "tired",
           pain = "pain",
           nauseated = "sick",
           safe = "safe",
           love = "love",
           recognizing = "recognize",
           communicating = "communicate",
           guilt = "guilty",
           disrespected = "hurt feelings",
           free_will = "decide",
           choices = "choices",
           self_restraint = "self-control",
           intentions = "plans",
           goal = "goals",
           conscious = "aware",
           self_aware = "self-aware",
           desires = "desires",
           embarrassed = "embarrassed",
           emo_recog = "empathy",
           joy = "joy",
           morality = "morality",
           personality = "personality",
           pleasure = "pleasure",
           pride = "pride")))
# make dataframe for plotting
scatter_plotting <- loadings(efa_d2_rotatedN)[] %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  rename(HEART = MR1,
         BODY = MR2,
         MIND = MR3) %>%
  full_join(wording_s2) %>%
  mutate(dominant = factor(
    ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), "BODY",
           ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), "HEART",
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), "MIND",
                         NA)))),
    size = ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(BODY), abs(BODY),
                  ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(HEART), abs(HEART),
                         ifelse(pmax(abs(BODY), abs(HEART), abs(MIND)) == abs(MIND), abs(MIND),
                                NA))),
    color = ifelse(dominant == "BODY", "#E41A1C",
                   ifelse(dominant == "HEART", "#4DAF4A",
                          ifelse(dominant == "MIND", "#E41A1C",
                                 NA))))
Joining, by = "item"
# plot!
figS2 <- plot_ly(scatter_plotting, x = ~HEART, y = ~BODY, z = ~MIND,
             type = "scatter3d",
             color = ~dominant, colors = c("#E41A1C", "#377EB8", "#4DAF4A"),
             marker = list(size = 4),
             text = ~short,
             textfont = list(size = 15),
             mode = "text+markers",
             showlegend = TRUE)
figS2

Heatmaps

NOTE: set to 3 factors manually, for now.

Study 1 (adults)

factors_s1 <- fa.sort(fa(d1_all, nfactors = 3, cor = chosenCorType, rotate = chosenRotType)$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  full_join(wording_s1) %>%
  select(wording, MR1, MR2, MR3) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
Joining, by = "item"
factors_s1_long <- factors_s1 %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s1_blank1 <- factors_s1_long %>%
  mutate(loading = rep(100, length(factors_s1_long$loading)))
# factors_s1_blank2 <- factors_s1_long %>%
#   mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s1_long$loading)*2/3)))
factors_s1_blank2 <- factors_s1_long %>%
  mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s1_long$loading)*2/3)))
factors_s1_blank3 <- factors_s1_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s1_long$loading)*1/3)))
# ggplot(factors_s1_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s1_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s1_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s1_long, aes(x = factor,
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  theme(text = element_text(size = 24),
        axis.text.x = element_text(size = 28),
        axis.title = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

Study 2 (7-9y)

factors_s2 <- fa.sort(fa(d2_all, nfactors = 3, cor = chosenCorType, rotate = chosenRotType)$loadings[]) %>%
  data.frame() %>%
  rownames_to_column(var = "item") %>%
  full_join(wording_s2) %>%
  select(wording, MR1, MR2, MR3) %>%
  rename(capacity = wording, Factor1 = MR1, Factor2 = MR2, Factor3 = MR3) %>%
  rownames_to_column(var = "order") %>%
  mutate(order = as.numeric(order))
Joining, by = "item"
factors_s2_long <- factors_s2 %>%
  gather(factor, loading, -capacity, -order) %>%
  mutate(factor = factor(gsub("Factor", "F", factor))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F1", "F3", "F2"))) %>%
  # mutate(factor = factor(gsub("Factor", "F", factor),
  #                        levels = c("F2", "F1", "F3"))) %>%
  arrange(order, factor)
factors_s2_blank1 <- factors_s2_long %>%
  mutate(loading = rep(100, length(factors_s2_long$loading)))
factors_s2_blank2 <- factors_s2_long %>%
  mutate(loading = ifelse(factor == "F1", loading, rep(100, length(factors_s2_long$loading)*2/3)))
# factors_s2_blank2 <- factors_s2_long %>%
#   mutate(loading = ifelse(factor == "F2", loading, rep(100, length(factors_s2_long$loading)*2/3)))
factors_s2_blank3 <- factors_s2_long %>%
  mutate(loading = ifelse(factor != "F3", loading, rep(100, length(factors_s2_long$loading)*1/3)))
# ggplot(factors_s2_blank1, aes(x = factor,
#                             y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s2_blank2, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
# 
# ggplot(factors_s2_blank3, aes(x = factor,
#                               y = reorder(capacity, desc(order)), fill = loading)) +
#   geom_tile(color = "black") +
#   # geom_text(aes(label = format(round(loading, 2), nsmall = 2))) +
#   scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 20)) +
#   scale_x_discrete(position = "top") +
#   theme_minimal() +
#   theme(text = element_text(size = 24),
#         axis.text.x = element_text(size = 28),
#         axis.title = element_blank(),
#         panel.grid = element_blank()) # 1000 by 1000
ggplot(factors_s2_long, aes(x = factor,
                            y = reorder(capacity, desc(order)), fill = loading)) +
  geom_tile(color = "black") +
  geom_text(aes(label = format(round(loading, 2), nsmall = 2)), size = 6) +
  scale_fill_distiller(palette = "RdYlBu", limits = c(-1, 1), breaks = c(-1, 0, 1),
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 20)) +
  scale_x_discrete(position = "top") +
  # geom_rect(aes(xmin = 0.51, xmax = 1.49, ymin = 14.55, ymax = 20.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 1.51, xmax = 2.49, ymin = 6.55, ymax = 14.45),
  #           alpha = 0, color = "black", size = .5) +
  # geom_rect(aes(xmin = 2.51, xmax = 3.49, ymin = 0.55, ymax = 6.45),
  #           alpha = 0, color = "black", size = .5) +
  # theme_bw() +
  theme_minimal() +
  theme(text = element_text(size = 24),
        axis.text.x = element_text(size = 28),
        axis.title = element_blank(),
        panel.grid = element_blank()) # 1000 by 1000

Mean ratings

Studies 1-2

Mean ratings of 40 mental capacities for the 2 entities included in Studies 1-2. Participants responded on a 3-point scale (0 = “no”, 0.5 = “kinda”, 1 = “yes”). Error bars are nonparametric bootstrapped 95% confidence intervals. Mental capacities are grouped according to their dominant factor loading in Study 1 (adults).

# make dataframe
s12_plotting <- char_plotting %>%
  filter(study %in% c("study 1", "study 2")) %>%
  distinct()
# plot! (ordered by study 1 factor loadings)
s12 <- ggplot(s12_plotting,
               aes(y = Mean, x = reorder(wording, desc(s1_order)),
                   colour = factor(s1_color), shape = study)) +
  geom_point(stat = "identity", position = position_dodge(width = 0.6), size = 2) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper), width = 0.4,
                position = position_dodge(width = 0.6)) +
  facet_wrap(~ character) +
  theme_bw() +
  scale_y_continuous(name = "\nMean rating",
                     limits = c(0, 1),
                     breaks = c(0, 0.5, 1),
                     labels = c("0\n(no)", "0.5\n(kinda)", "1\n(yes)")) +
  scale_shape_discrete(name = "Study:",
                       labels = c("Study 1: adults", "Study 2: 7-9y")) +
  # scale_colour_brewer(name = "Factor:",
  #                     type = "qual", palette = 6,
  #                     guide = FALSE) +
  scale_colour_manual(name = "Factor:",
                      values = c("#E41A1C", "#4DAF4A", "#377EB8"),
                      labels = c("BODY", "MIND", "HEART")) +
  coord_flip() +
  theme(text = element_text(size = 9),
      axis.title.y = element_blank(),
      axis.text.y = element_text(face = "italic",
                                 colour = palette_s1),
      panel.grid.minor = element_blank(),
      legend.position = "right")
s12

Mean factor scores

Studies 1-2

r1b <- brm(score ~ character * factor * age_group + (1 | subid) , tempC,
            family = "gaussian", cores = n_cores)
Compiling the C++ model
Start sampling
starting worker pid=1176 on localhost:11418 at 13:16:46.683
starting worker pid=1184 on localhost:11418 at 13:16:46.951
starting worker pid=1192 on localhost:11418 at 13:16:47.198
starting worker pid=1200 on localhost:11418 at 13:16:47.439

SAMPLING FOR MODEL 'gaussian(identity) brms-model' NOW (CHAIN 1).

Gradient evaluation took 0.012079 seconds
1000 transitions using 10 leapfrog steps per transition would take 120.79 seconds.
Adjust your expectations accordingly!


Iteration:    1 / 2000 [  0%]  (Warmup)

SAMPLING FOR MODEL 'gaussian(identity) brms-model' NOW (CHAIN 2).

Gradient evaluation took 0.015809 seconds
1000 transitions using 10 leapfrog steps per transition would take 158.09 seconds.
Adjust your expectations accordingly!


Iteration:    1 / 2000 [  0%]  (Warmup)

SAMPLING FOR MODEL 'gaussian(identity) brms-model' NOW (CHAIN 3).

Gradient evaluation took 0.022298 seconds
1000 transitions using 10 leapfrog steps per transition would take 222.98 seconds.
Adjust your expectations accordingly!


Iteration:    1 / 2000 [  0%]  (Warmup)

SAMPLING FOR MODEL 'gaussian(identity) brms-model' NOW (CHAIN 4).

Gradient evaluation took 0.025095 seconds
1000 transitions using 10 leapfrog steps per transition would take 250.95 seconds.
Adjust your expectations accordingly!


Iteration:    1 / 2000 [  0%]  (Warmup)
# r1c <- brm(score ~ character * factor * age_group + (factor | subid) , tempC,
#             family = "gaussian", cores = n_cores)
# summary(r1c)
# plot
ggplot(scores_s12_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                # labels = c("Social-emotional",
                                #            "Bodily",
                                #            "Perceptual-cognitive")),
                                labels = c("Heart",
                                           "Body",
                                           "Mind")),
                age_group = factor(age_group,
                                  # levels = c("adults", "children_79"),
                                  # labels = c("adults", "children"))),
                                  levels = c("children_79", "adults"),
                                  labels = c("children", "adults"))),
       aes(x = age_group, y = Mean, color = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        legend.position = "bottom") +
  geom_point(size = 5, position = position_dodge(width = 0.4)) +
  geom_errorbar(aes(ymin = Lower, ymax = Upper),
                width = 0, position = position_dodge(width = 0.4)) +
  scale_shape_manual(values = c(19, 15)) +
  labs(title = "Factor scores by age group",
       # subtitle = "Adults (Study 1) vs. children (Study 2)\n",
       x = "Age group",
       y = "Mean factor score") # 1000 by 500

Factor scores by age

Study 1

scores_s1_plotting <- d1 %>% 
  select(subid, age, character) %>% 
  distinct() %>% 
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(efa_d1_rotatedN$scores %>% 
              data.frame() %>% 
              rownames_to_column("subid")) %>%
  mutate(character = factor(character)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor))

ggplot(scores_s1_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                levels = c("score_F1", "score_F2", "score_F3"),
                                # labels = c("Social-emotional",
                                #            "Bodily",
                                #            "Perceptual-cognitive"))),
                                labels = c("Heart",
                                           "Body",
                                           "Mind"))),
       aes(x = age, y = score, color = character, fill = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        legend.position = "bottom") +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.4) +
  geom_point(size = 2) +
  scale_shape_manual(values = c(19, 15)) +
  labs(title = "Factor scores by adults' age",
       # subtitle = "Adults (Study 1)\n",
       x = "Age (years)",
       y = "Factor score") # 1000 by 500

Study 2

scores_s2_plotting <- d2 %>% 
  select(subid, age, character) %>% 
  distinct() %>% 
  mutate(subid = paste(character, subid, sep = "_")) %>%
  # full_join(efa_d2_rotatedN$scores %>% 
  full_join(efa_d12_all_rotated$scores %>% 
              data.frame() %>% 
              rownames_to_column("subid")) %>%
  mutate(character = factor(character)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor))

contrasts(scores_s2_plotting$factor) = cbind(factor1 = c(1, -1, 0),
                                factor3 = c(0, -1, 1))

contrasts(scores_s2_plotting$character) = cbind(robot = c(-1, 1))

r2 <- lmer(score ~ character * factor * scale(age, scale = F) + (1 | subid) , scores_s2_plotting)
summary(r2)

# r2b <- brm(score ~ character * factor * age + (1 | subid) , scores_s2_plotting %>% mutate(age = scale(age, scale = F)), family = "gaussian", cores = n_cores)
# summary(r2b)

# look at heart only
# r2c_heart <- brm(score ~ character * age, 
#            data = scores_s2_plotting %>% 
#              filter(factor == "score_F1") %>% 
#              mutate(age = scale(age, scale = F)), 
#            family = "gaussian", cores = n_cores)
# summary(r2c_heart)

# look at body only
# r2c_body <- brm(score ~ character * age, 
#            data = scores_s2_plotting %>% 
#              filter(factor == "score_F2") %>% 
#              mutate(age = scale(age, scale = F)), 
#            family = "gaussian", cores = n_cores)
# summary(r2c_body)

# look at mind only
# r2c_mind <- brm(score ~ character * age, 
#            data = scores_s2_plotting %>% 
#              filter(factor == "score_F3") %>% 
#              mutate(age = scale(age, scale = F)), 
#            family = "gaussian", cores = n_cores)
# summary(r2c_mind)
ggplot(scores_s2_plotting %>%
         ungroup() %>%
         mutate(factor = factor(factor,
                                labels = c("Heart",
                                           "Body",
                                           "Mind"))),
                         # labels = c("Social-emotional",
                         #            "Bodily",
                         #            "Perceptual-cognitive"))),
       aes(x = age, y = score, color = character, fill = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        legend.position = "bottom") +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.4) +
  geom_point(size = 2) +
  scale_shape_manual(values = c(19, 15)) +
  labs(title = "Factor scores by children's age",
       # subtitle = "Children (Study 2)\n",
       x = "Age (years)",
       y = "Factor score") # 1000 by 500

Studies 1-2

tempA <- d2 %>% 
  select(subid, age, character) %>% 
  distinct() %>% 
  mutate(subid = paste(character, subid, sep = "_")) %>%
  full_join(efa_d12_all_rotatedN$scores %>% 
              data.frame() %>% 
              rownames_to_column("subid")) %>%
  mutate(character = factor(character)) %>%
  rename(score_F1 = MR1, score_F2 = MR2, score_F3 = MR3) %>%
  filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
  gather(factor, score, starts_with("score_")) %>%
  mutate(factor = factor(factor,
                         labels = c("Heart",
                                    "Body",
                                    "Mind")))
                         # labels = c("Social-emotional",
                         #            "Bodily",
                         #            "Perceptual-cognitive")))

tempB <- scores_s12_plotting %>%
  filter(age_group == "adults") %>%
  ungroup() %>%
  mutate(factor = factor(factor,
                         labels = c("Heart",
                                    "Body",
                                    "Mind")),
                         # labels = c("Social-emotional",
                         #            "Bodily",
                         #            "Perceptual-cognitive")),
         age = 11) 

ggplot(tempA,
       aes(x = age, y = score, color = character, fill = character, shape = character)) +
  facet_wrap("factor", ncol = 3) +
  theme_bw() +
  theme(text = element_text(size = 28),
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  geom_hline(data = tempB, aes(yintercept = Mean, color = character), lty = 2) +
  # geom_smooth(method = "loess", alpha = 0.4) +
  geom_smooth(method = "lm", alpha = 0.4) +
  geom_point(size = 2) +
  geom_point(data = tempB, aes(y = Mean),
             size = 4, position = position_dodge(width = 0.6)) +
  geom_errorbar(data = tempB, aes(ymin = Lower, ymax = Upper, y = Mean), width = 0,
                position = position_dodge(width = 0.6)) +
  scale_shape_manual(values = c(19, 15)) +
  scale_x_continuous(breaks = c(7:11), labels = c("7y", "8y", "9y", "10y", "adults")) +
  labs(title = "Factor scores by age",
       # subtitle = "Children (Study 2)\n",
       x = "Age",
       y = "Factor score") # 1000 by 500
LS0tCnRpdGxlOiAiRGlta2lkIFBhcGVyICMxIEFuYWx5c2lzICg3LTl5byBhbmQgQWR1bHRzKSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKIyBTZXR1cAoKYGBge3Igd29ya3NwYWNlIHNldHVwfQojIGxvYWQgbGlicmFyaWVzCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGxhbmdjb2cpICMgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbGFuZ2NvZy9sYW5nY29nCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJtcykKbGlicmFyeShwYXJhbGxlbCkKCiMgY2xlYXIgd29ya3NwYWNlCiMgcm0obGlzdCA9IGxzKGFsbCA9IFQpKQpncmFwaGljcy5vZmYoKQoKIyBzZXQgbnVtYmVyIG9mIGNvcmVzIGZvciBicm1zCm5fY29yZXMgPC0gZGV0ZWN0Q29yZXMoKQpgYGAKCmBgYHtyIGZ1bmN0aW9uc30KIyBtYWtlIHJvdW5kaW5nIGZ1bmN0aW9uCnJvdW5kMiA8LSBmdW5jdGlvbih4KSB7Zm9ybWF0KHJvdW5kKHgsIDIpLCBuc21hbGwgPSAyKX0KCiMgbWFrZSBjbGVhbnVwIGZ1bmN0aW9uCmNsZWFudXAgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSwgYWdlX2dyb3VwKSB7CiAgaWYoZ3JlcGwoImFkdWx0IiwgYWdlX2dyb3VwKSkgewogICAgCiAgICAjIHNldCB0YXJnZXQgZGF0YXNldAogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMSIpe2QgPC0gZF9yYXdfc3R1ZHkxfQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWIiKXtkIDwtIGRfcmF3X3N0dWR5MWJ9CiAgICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYyIpe2QgPC0gZF9yYXdfc3R1ZHkxY30KICAgIAogICAgIyBlbmFjdCBleGNsdXNpb25hcnkgY3JpdGVyaWEKICAgIGRfY2xlYW5fMSA8LSBkCiAgICAKICAgICMgcmVjb2RlIGJhY2tncm91bmQgYW5kIGRlbW9ncmFwaGljIHZhcmlhYmxlcwogICAgZF9jbGVhbiA8LSBkX2NsZWFuXzEgJT4lCiAgICAgIG11dGF0ZSggIyBkZWFsIHdpdGggc3R1ZHkgbnVtYmVyCiAgICAgICAgc3R1ZHkgPSBmYWN0b3Ioc3R1ZHkpKSAlPiUKICAgICAgbXV0YXRlKCAjIGRlYWwgd2l0aCByYWNlCiAgICAgICAgcmFjZV9jYXQyID0gZmFjdG9yKHN1YigiICskIiwgIiIsIGV0aG5pY2l0eSkpLAogICAgICAgIHJhY2VfY2F0MyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoIiAiLCByYWNlX2NhdDIpID09IFQsICJtdWx0aXJhY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIocmFjZV9jYXQyKSkpKSAlPiUKICAgICAgZHBseXI6OnNlbGVjdChzdHVkeSwgc3ViaWQ6Y291bnRyeV9zZWxmcmVwLCBhZ2VfZ3JvdXAsIHJhY2VfY2F0MykgJT4lCiAgICAgIHJlbmFtZShyYWNlX2NhdCA9IHJhY2VfY2F0MykgJT4lCiAgICAgIG11dGF0ZSggIyBkZWFsIHdpdGggcmVsaWdpb24gKG5vdGU6IG9ubHkgZGVhbGluZyB3aXRoIGNoaWxkaG9vZCByZWxpZ2lvbiBmb3Igbm93KQogICAgICAgIHJlbGlnaW9uX2NhdDIgPSBmYWN0b3Ioc3ViKCIgKyQiLCAiIiwgcmVsaWdpb25DaGlsZCkpLAogICAgICAgIHJlbGlnaW9uX2NhdDMgPSBmYWN0b3IoaWZlbHNlKGdyZXBsKCIgIiwgcmVsaWdpb25fY2F0MikgPT0gVCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcmVsaWdpb3VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIocmVsaWdpb25fY2F0MikpKSkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3Qoc3R1ZHk6cmFjZV9jYXQsIHJlbGlnaW9uX2NhdDMpICU+JQogICAgICByZW5hbWUocmVsaWdpb25fY2F0ID0gcmVsaWdpb25fY2F0MykKICAgIAogICAgIyByZW1vdmUgZXh0cmFuZW91cyBkZnMgYW5kIHZhcmlhYmxlcwogICAgcm0oZCwgZF9jbGVhbl8xKQogIH0KICAKICBpZihncmVwbCgiY2hpbGQiLCBhZ2VfZ3JvdXApKSB7CiAgICAKICAgICMgc2V0IHRhcmdldCBkYXRhc2V0CiAgICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkX3Jhd19zdHVkeTJ9CiAgICAjIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDMiKXtkIDwtIGRfcmF3X3N0dWR5M30KICAgICMgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZF9yYXdfc3R1ZHk0fQogICAgCiAgICAjIHJlY29kZSBiYWNrZ3JvdW5kIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMKICAgIGRfY2xlYW5fMiA8LSBkICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHN0dWR5IG51bWJlcgogICAgICAgIHN0dWR5ID0gZmFjdG9yKHN0dWR5KSwKICAgICAgICByZXNwb25zZU51bSA9IGlmZWxzZSghaXMubmEocmVzcG9uc2VOdW0pLCByZXNwb25zZU51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmVzcG9uc2UgPT0gIm5vIiwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZXNwb25zZSA9PSAia2luZGEiLCAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJlc3BvbnNlID09ICJ5ZXMiLCAxLCBOQSkpKSkpCiAgICAjIE5PVEU6IG5lZWQgdG8gcmVjb25jaWxlIHJhY2UvZXRobmljaXR5IGF0IHNvbWUgcG9pbnQuLi4KICAgICMgTk9URTogbmVlZCB0byBkZWFsIHdpdGggZ2VuZGVyIGF0IHNvbWUgcG9pbnQuLi4KICAKICAgIGRfY2xlYW4gPC0gZF9jbGVhbl8yCiAgICAKICAgICMgcmVtb3ZlIGV4dHJhbmVvdXMgZGZzIGFuZCB2YXJpYWJsZXMKICAgIHJtKGQsIGRfY2xlYW5fMikKICB9CiAgCiAgIyByZW1vdmUgb3V0bGllcnMgaWYgZGVzaXJlZAogIGlmKGNob3Nlbk91dGxpZXJIYW5kbGluZyA9PSAicmVtb3ZlIikgewogICAgCiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lCiAgICAgIGdhdGhlcihjYXBhY2l0eSwgc2NvcmUsIGhhcHB5OnByaWRlKSAlPiUKICAgICAgZ3JvdXBfYnkoY2hhcmFjdGVyLCBjYXBhY2l0eSkgJT4lCiAgICAgIGZpbHRlcighc2NvcmUgJWluJSBib3hwbG90LnN0YXRzKHNjb3JlLCAyLjUpJG91dCkgJT4lCiAgICAgIHNwcmVhZChjYXBhY2l0eSwgc2NvcmUpICU+JQogICAgICBhcnJhbmdlKGNoYXJhY3Rlciwgc3ViaWQpCiAgICAKICB9CiAgCiAgIyBmaWx0ZXIgY2hhcmFjdGVycyBpZiBkZXNpcmVkCiAgaWYoaXMuZWxlbWVudCgibm9uZSIsIGNob3NlbkV4Y2x1ZGUpKSB7fSBlbHNlIHsKICAgIAogICAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgICBmaWx0ZXIoIWNoYXJhY3RlciAlaW4lIGNob3NlbkV4Y2x1ZGUpCiAgICAKICAgIH0KICAgIAogICMgZmlsdGVyIGl0ZW1zIGlmIGRlc2lyZWQKICBpZihpcy5lbGVtZW50KCJub25lIiwgY2hvc2VuRXhjbHVkZUl0ZW0pKSB7fSBlbHNlIHsKICAgIGRfY2xlYW4gPC0gZF9jbGVhbiAlPiUKICAgICAgZHBseXI6OmZpbHRlcighY2FwYWNpdHkgJWluJSBjaG9zZW5FeGNsdWRlSXRlbSkKICB9CiAgCiAgIyBkcm9wIHRyaWFscyA8MjUwIG1zCiAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgZmlsdGVyKHJ0ID49IDI1MCB8IGlzLm5hKHJ0KSkKICAKICAjIGNlbnRlciByZXNwb25zZSB2YXJpYWJsZQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIikgewogICAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgICBtdXRhdGUocmVzcG9uc2VOdW1DID0gcmVzcG9uc2VOdW0gLSA0KQogIH0gZWxzZSB7CiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lCiAgICAgIG11dGF0ZShyZXNwb25zZU51bUMgPSByZXNwb25zZU51bSAtIDAuNSkKICB9CgogICAgIyByZW5hbWUgY2hhcmFjdGVyIG5hbWUgdmFyaWFibGVzCiAgaWYoImNoYXJOYW1lIiAlaW4lIG5hbWVzKGRfY2xlYW4pKSB7CiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lIHJlbmFtZShjaGFyYWN0ZXIgPSBjaGFyTmFtZSkKICB9CiAgCiAgIyBjbGVhbnVwCiAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgZmlsdGVyKCFpcy5uYShzdWJpZCksICFpcy5uYShjaGFyYWN0ZXIpLCAhaXMubmEoY2FwYWNpdHkpKQogIAogICMgcmV0dXJuIGNsZWFuZWQgZGF0YXNldAogIHJldHVybihkX2NsZWFuKQp9CgojIG1ha2UgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBkYXRhZnJhbWVzIGZvciBkaW1lbnNpb24gcmVkdWNhdGlvbgptYWtlRFJERiA8LSBmdW5jdGlvbihkYXRhc291cmNlLCBjaG9zZW5Db25kaXRpb24pIHsKICAKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KCiAgIyBmaWx0ZXIgYnkgY2hhcmFjdGVyIGlmIHNwZWNpZmllZAogIGlmKGNob3NlbkNvbmRpdGlvbiAlaW4lIGMoImJlZXRsZSIsICJyb2JvdCIpKSB7CiAgICBkIDwtIGQgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gY2hvc2VuQ29uZGl0aW9uKQogIH0KCiAgIyBtYWtlIHN0cmlwcGVkIGRhdGFmcmFtZSBmb3IgZGltZW5zaW9uIHJlZHVjYXRpb24gYW5hbHlzZXMKICBkX3N0cmlwIDwtIGQgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKGNoYXJhY3RlciksICFpcy5uYShzdWJpZCksICFpcy5uYShjYXBhY2l0eSksIGNhcGFjaXR5ICE9ICIiKSAlPiUKICAgIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogICAgc2VsZWN0KHN1YmlkLCBjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogICAgc3ByZWFkKGNhcGFjaXR5LCByZXNwb25zZU51bSkgJT4lCiAgICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic3ViaWQiKQoKICAjIHJldHVybiBzdHJpcHBlZCBkYXRhZnJhbWUKICByZXR1cm4oZF9zdHJpcCkKfQoKIyBtYWtlIGRlbW9ncmFwaGljcyBmdW5jdGlvbnMKZGVtb1NhbXBsZVNpemUgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSkgewoKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KCiAgIyBnZXQgZGlzdGluY3Qgc3ViaWRzCiAgc2FtcGxlX3NpemUgPC0gZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlcikgJT4lIGNvdW50KGNoYXJhY3RlcikgJT4lIGRhdGEuZnJhbWUoKQoKICAjIGFkZCB0b3RhbCBzYW1wbGUgc2l6ZSAgCiAgc2FtcGxlX3NpemUgPC0gcmJpbmQoc2FtcGxlX3NpemUgJT4lIG11dGF0ZShjaGFyYWN0ZXIgPSBhcy5jaGFyYWN0ZXIoY2hhcmFjdGVyKSksCiAgICAgICAgICAgICAgICAgICAgICAgYyhjaGFyYWN0ZXIgPSAiYWxsIiwgbiA9IGQgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpKSkKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oc2FtcGxlX3NpemUpCn0KZGVtb0R1cmF0aW9uIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDIgJT4lIHJlbmFtZShkdXJhdGlvbiA9IHNlc3Npb25EdXJhdGlvbil9CgogICMgZ2V0IHNhbXBsZSBzaXplIHBlciBjaGFyYWN0ZXIKICBkdXJhdGlvbiA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZHVyYXRpb24pICU+JQogICAgbXV0YXRlKGR1cmF0aW9uID0gYXMubnVtZXJpYyhkdXJhdGlvbikpICU+JQogICAgZ3JvdXBfYnkoY2hhcmFjdGVyKSAlPiUKICAgIHN1bW1hcmlzZShtaW5fZHVyYXRpb24gPSBtaW4oZHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWF4X2R1cmF0aW9uID0gbWF4KGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lZGlhbl9kdXJhdGlvbiA9IG1lZGlhbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBtZWFuX2R1cmF0aW9uID0gbWVhbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBzZF9kdXJhdGlvbiA9IHNkKGR1cmF0aW9uLCBuYS5ybSA9IFQpKQoKICAjIGFkZCB0b3RhbCBkdXJhdGlvbgogIGFsbCA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZHVyYXRpb24pICU+JQogICAgbXV0YXRlKGR1cmF0aW9uID0gYXMubnVtZXJpYyhkdXJhdGlvbikpICU+JQogICAgc3VtbWFyaXNlKG1pbl9kdXJhdGlvbiA9IG1pbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBtYXhfZHVyYXRpb24gPSBtYXgoZHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVkaWFuX2R1cmF0aW9uID0gbWVkaWFuKGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lYW5fZHVyYXRpb24gPSBtZWFuKGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIHNkX2R1cmF0aW9uID0gc2QoZHVyYXRpb24sIG5hLnJtID0gVCkpICU+JQogICAgbXV0YXRlKGNoYXJhY3RlciA9ICJhbGwiKQogIAogIGR1cmF0aW9uIDwtIHJiaW5kKGR1cmF0aW9uLCBhbGwpICMgbm90IHN1cmUgd2h5IGZ1bGxfam9pbiBkb2Vzbid0IHdvcmsgICAgCgogICMgcmV0dXJuIGRhdGFmcmFtZQogIHJldHVybihkdXJhdGlvbikKfQpkZW1vQWdlIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CgogICMgZ2V0IHNhbXBsZSBzaXplIHBlciBjaGFyYWN0ZXIKICBhZ2UgPC0gZCAlPiUKICAgIGRpc3RpbmN0KHN1YmlkLCBjaGFyYWN0ZXIsIGFnZSkgJT4lCiAgICBtdXRhdGUoYWdlID0gYXMubnVtZXJpYyhhZ2UpKSAlPiUKICAgIGdyb3VwX2J5KGNoYXJhY3RlcikgJT4lCiAgICBzdW1tYXJpc2UobWluX2FnZSA9IG1pbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWF4X2FnZSA9IG1heChhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVkaWFuX2FnZSA9IG1lZGlhbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVhbl9hZ2UgPSBtZWFuKGFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBzZF9hZ2UgPSBzZChhZ2UsIG5hLnJtID0gVCkpCgogICMgYWRkIHRvdGFsIGFnZQogIGFsbCA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgYWdlKSAlPiUKICAgIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpICU+JQogICAgc3VtbWFyaXNlKG1pbl9hZ2UgPSBtaW4oYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1heF9hZ2UgPSBtYXgoYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lYW5fYWdlID0gbWVhbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgc2RfYWdlID0gc2QoYWdlLCBuYS5ybSA9IFQpKSAlPiUKICAgIG11dGF0ZShjaGFyYWN0ZXIgPSAiYWxsIikKICBhZ2UgPC0gZnVsbF9qb2luKGFnZSwgYWxsKQoKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oYWdlKQp9CmRlbW9HZW5kZXIgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSkgewoKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KCiAgIyBnZXQgZ2VuZGVyIHBlciBjaGFyYWN0ZXIgYW5kIG92ZXJhbGwKICBnZW5kZXIgPC0gZGF0YS5mcmFtZShhZGRtYXJnaW5zKHdpdGgoZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZ2VuZGVyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKGNoYXJhY3RlciwgZ2VuZGVyKSkpKSAlPiUKICAgIGZpbHRlcihnZW5kZXIgIT0gIlN1bSIpICU+JQogICAgcmVuYW1lKG4gPSBGcmVxKQogIAogIGdlbmRlciA8LSBnZW5kZXIgJT4lCiAgICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGlmZWxzZShjaGFyYWN0ZXIgPT0gIlN1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIiwgYXMuY2hhcmFjdGVyKGNoYXJhY3RlcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJiZWV0bGUiLCAicm9ib3QiLCAiYWxsIikpKSAlPiUKICAgIGFycmFuZ2UoY2hhcmFjdGVyLCBnZW5kZXIpICU+JQogICAgc3ByZWFkKGdlbmRlciwgbikKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oZ2VuZGVyKQp9CmRlbW9SYWNlIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDIgJT4lIAogICAgbXV0YXRlKGV0aG5pY2l0eSA9IGFzLmNoYXJhY3RlcihldGhuaWNpdHkpLAogICAgICAgICAgIHdoaXRlID0gZ3JlcGwoIndoaXRlIiwgZXRobmljaXR5KSB8IGdyZXBsKCJjYXVjIiwgZXRobmljaXR5KSB8IAogICAgICAgICAgICAgZ3JlcGwoImV1cm8iLCBldGhuaWNpdHkpIHwgZ3JlcGwoImF1c3RyYWxpYSIsIGV0aG5pY2l0eSksCiAgICAgICAgICAgYmxhY2sgPSBncmVwbCgiYmxhY2siLCBldGhuaWNpdHkpIHwgZ3JlcGwoImFmcmljYSIsIGV0aG5pY2l0eSksCiAgICAgICAgICAgbGF0aW54ID0gZ3JlcGwoImhpc3AiLCBldGhuaWNpdHkpIHwgZ3JlcGwoImxhdGluIiwgZXRobmljaXR5KSwKICAgICAgICAgICBFX2FzaWFuID0gKGdyZXBsKCJlYXN0IGFzaWFuIiwgZXRobmljaXR5KSAmIGdyZXBsKCJzb3V0aGVhc3QiLCBldGhuaWNpdHkpID09IEYpIHwgCiAgICAgICAgICAgICBncmVwbCgiY2hpbiIsIGV0aG5pY2l0eSkgfCBncmVwbCgia29yZWEiLCBldGhuaWNpdHkpIAogICAgICAgICAgIHwgZ3JlcGwoIlxcKGFzaWFuXFwpIiwgZXRobmljaXR5KSB8IAogICAgICAgICAgICAgZ3JlcGwoIlxcL2FzaWFuIiwgZXRobmljaXR5KSwKICAgICAgICAgICBTU0VfYXNpYW4gPSBncmVwbCgic291dGggb3Igc291dGhlYXN0IiwgZXRobmljaXR5KSB8IAogICAgICAgICAgICAgKGdyZXBsKCJpbmRpYSIsIGV0aG5pY2l0eSkgJiBncmVwbCgibmF0aXZlIiwgZXRobmljaXR5KSA9PSBGKSB8CiAgICAgICAgICAgICBncmVwbCgidmlldG5hbSIsIGV0aG5pY2l0eSkgfCBncmVwbCgicGFraXN0YW4iLCBldGhuaWNpdHkpLAogICAgICAgICAgIG5hdF9hbSA9IGdyZXBsKCJuYXRpdmUgYW1lcmljYW4iLCBldGhuaWNpdHkpLAogICAgICAgICAgIG1pZGRsZV9lYXN0ID0gZ3JlcGwoIm1pZGRsZSIsIGV0aG5pY2l0eSkpICU+JQogICAgbXV0YXRlKHJhY2VfY2F0ID0gaWZlbHNlKHdoaXRlICsgYmxhY2sgKyBsYXRpbnggKyBFX2FzaWFuICsgU1NFX2FzaWFuICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRfYW0gKyBtaWRkbGVfZWFzdCA+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcmFjaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpdGUsICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShibGFjaywgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsYXRpbngsICJsYXRpbngiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFX2FzaWFuLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShTU0VfYXNpYW4sICJzb3V0aF9zb3V0aGVhc3RfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5hdF9hbSwgIm5hdGl2ZV9hbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG1pZGRsZV9lYXN0LCAibWlkZGxlX2Vhc3Rlcm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpKSkpKQogIH0KCiAgIyBnZXQgcmFjZSBwZXIgY2hhcmFjdGVyIGFuZCBvdmVyYWxsCiAgcmFjZSA8LSBkYXRhLmZyYW1lKGFkZG1hcmdpbnMod2l0aChkICU+JSBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyLCByYWNlX2NhdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUoY2hhcmFjdGVyLCByYWNlX2NhdCkpKSkgJT4lCiAgICBmaWx0ZXIocmFjZV9jYXQgIT0gIlN1bSIpICU+JQogICAgcmVuYW1lKG4gPSBGcmVxKQoKICAgIHJhY2UgPC0gcmFjZSAlPiUKICAgICAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihpZmVsc2UoY2hhcmFjdGVyID09ICJTdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIiwgYXMuY2hhcmFjdGVyKGNoYXJhY3RlcikpKSkgJT4lCiAgICAgIGFycmFuZ2UoY2hhcmFjdGVyLCByYWNlX2NhdCkgJT4lCiAgICAgIHNwcmVhZChyYWNlX2NhdCwgbikKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4ocmFjZSkKfQoKIyBwbG90dGluZyBmdW5jdGlvbnMKbWFrZUZhY2V0TGFicyA8LSBmdW5jdGlvbihkZl9wbG90dGluZykgewogIGZhY2V0X2xhYmVscyA8LSBhcnJheSgpCiAgZGZfcGxvdHRpbmcgPC0gZGZfcGxvdHRpbmcgJT4lIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkKICBmb3IoaSBpbiAxOmxlbmd0aChsZXZlbHMoZGZfcGxvdHRpbmckY2hhcmFjdGVyKSkpIHsKICAgIGRmIDwtIGRmX3Bsb3R0aW5nICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09IGxldmVscyhkZl9wbG90dGluZyRjaGFyYWN0ZXIpW2ldKSAlPiUKICAgICAgc2VsZWN0KGNoYXJhY3RlciwgbikgJT4lIHVuaXF1ZSgpCiAgICBmYWNldF9sYWJlbHNbaV0gPC0gcGFzdGUwKGRmJGNoYXJhY3RlciwgIiAobiA9ICIsIGRmJG4sICIpIikKICB9CiAgbmFtZXMoZmFjZXRfbGFiZWxzKSA8LSBsZXZlbHMoZGZfcGxvdHRpbmckY2hhcmFjdGVyKQogIHJldHVybihmYWNldF9sYWJlbHMpCn0KYGBgCgpgYGB7ciBtb2RlbGluZyBkZWNpc2lvbnN9CiMgcmVtb3ZlIG91dGxpZXJzPwpjaG9zZW5PdXRsaWVySGFuZGxpbmcgPC0gImtlZXAiCiMgY2hvc2VuT3V0bGllckhhbmRsaW5nIDwtICJyZW1vdmUiCgojIGV4Y2x1ZGUgYW55IGNvbmRpdGlvbnMgKGNoYXJhY3RlcnMpPwpjaG9zZW5FeGNsdWRlIDwtICJub25lIgojIGNob3NlbkV4Y2x1ZGUgPC0gYygic3RhcGxlciIsICJjYXIiLCAiY29tcHV0ZXIiKQoKIyBleGNsdWRlIGFueSBpdGVtcyAobWVudGFsIGNhcGFjaXRpZXMpPwojIGNob3NlbkV4Y2x1ZGVJdGVtIDwtICJub25lIgojIGNob3NlbkV4Y2x1ZGVJdGVtIDwtICJjb21wdXRhdGlvbnMiCmNob3NlbkV4Y2x1ZGVJdGVtIDwtIGMoIm1ldGFsIiwgIm9uX29mZiIpCgojIE5PVEU6IGFsd2F5cyBjaG9vc2UgbWluaW1hbCByZXNpZHVhbCAoZm0gPSAibWlucmVzIikgaW5zdGVhZCBvZiBNTCBiZWNhdXNlIG9mIG5vbi1ub3JtYWxpdHkKCiMgZm9yIEVGQXMsIHdoYXQga2luZCBvZiBjb3JyZWxhdGlvbj8KY2hvc2VuQ29yVHlwZSA8LSAiY29yIiAjIHBlYXJzb24gY29ycmVsYXRpb24KIyBjaG9zZW5Db3JUeXBlIDwtICJwb2x5IiAjIHBvbHljaG9yaWMgY29ycmVsYXRpb24KCiMgZm9yIEVGQXMsIHdoYXQga2luZCBvZiByb3RhdGlvbj8KY2hvc2VuUm90VHlwZSA8LSAib2JsaW1pbiIgIyBvYmxpbWluIHJvdGF0aW9uCiMgY2hvc2VuUm90VHlwZSA8LSAib2JsaW1pbiIgIyBvYmxpbWluIHJvdGF0aW9uCiMgY2hvc2VuUm90VHlwZSA8LSAibm9uZSIgIyBubyByb3RhdGlvbgoKZGF0YS5mcmFtZSgiY29uZGl0aW9uc0V4Y2x1ZGVkIiA9IGNob3NlbkV4Y2x1ZGUsCiAgICAgICAgICAgIm91dGxpZXJIYW5kbGluZyIgPSBjaG9zZW5PdXRsaWVySGFuZGxpbmcsCiAgICAgICAgICAgIkVGQV9jb3JyZWxhdGlvbiIgPSBjaG9zZW5Db3JUeXBlLAogICAgICAgICAgICJFRkFfcm90YXRpb24iID0gY2hvc2VuUm90VHlwZSkKYGBgCgo8cCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGEgaHJlZj0iI2hlYWRlciI+YmFjayB0byBUT0M8L2E+PC9wPgoKIyBEYXRhIHByZXBhcmF0aW9uCgpgYGB7ciBkYXRhIHVwbG9hZH0KIyBzdHVkeSAxICgyMDE2LTA3LTA2LCBhZHVsdHMsIDIgY29uZGl0aW9ucywgMy1wb2ludCBzY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgIm1ha2UgcGxhbnMiKQpkX3Jhd19zdHVkeTEgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvYWR1bHRzL3VzX3J1bi0wMV8yMDE2LTA2LTA1X2Fub255bWl6ZWQuY3N2IikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gInN0dWR5IDEiLCBhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lIHNlbGVjdCgtWCkKCiMgc3R1ZHkgMWIgKDIwMTctMDctMTksIGFkdWx0cywgMiBjb25kaXRpb25zLCA3LXBvaW50IHNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAibWFrZSBwbGFucyIpCmRfcmF3X3N0dWR5MWIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvYWR1bHRzL3VzX3J1bi0wMl8yMDE2LTA3LTE5X2Fub255bWl6ZWQuY3N2IikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gInN0dWR5IDFiIiwgYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JSBzZWxlY3QoLVgpCgojIHN0dWR5IDFjICgyMDE2LTEyLTA4LCBhZHVsdHMsIDIgY29uZGl0aW9ucywgMy1wb2ludCBzY2FsZSwgImhhdmUgZnJlZSB3aWxsIiBhbmQgImhhdmUgaW50ZW50aW9ucyIpCmRfcmF3X3N0dWR5MWMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvYWR1bHRzL3VzX3J1bi0wM18yMDE2LTEyLTA4X2Fub255bWl6ZWQuY3N2IikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gInN0dWR5IDFjIiwgYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JSBzZWxlY3QoLVgpCgojIHN0dWR5IDIgKEp1bmUgLSBEZWNlbWJlciAyMDE2LCA3LTl5bywgMiBjb25kaXRpb25zLCAzLXBvaW50LXNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAibWFrZSBwbGFucyIpCmRfcmF3X3N0dWR5MiA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL0RpbWtpZC9kaW1raWQvZGF0YS9jaGlsZHJlbi9ydW4tMDFfMjAxNy0wNy0yNF9hbm9ueW1pemVkLmNzdiIpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAyIiwgYWdlX2dyb3VwID0gImNoaWxkcmVuXzc5IikgJT4lIHNlbGVjdCgtWCkKYGBgCgpgYGB7ciBkYXRhIGNsZWFudXB9CiMgY2xlYW4gdXAgZGF0YXNldHMKZDEgPC0gY2xlYW51cCgic3R1ZHkgMSIsICJhZHVsdHMiKQpkMWIgPC0gY2xlYW51cCgic3R1ZHkgMSIsICJhZHVsdHMiKQpkMWMgPC0gY2xlYW51cCgic3R1ZHkgMSIsICJhZHVsdHMiKQpkMiA8LSBjbGVhbnVwKCJzdHVkeSAyIiwgImNoaWxkcmVuIikKCiMgdHdlYWsgYnkgaGFuZApkMiA8LSBkMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JQogIGZpbHRlcihhZ2UgPj0gNywgYWdlIDwgMTApICU+JQogIGZpbHRlcihjaGFyYWN0ZXIgIT0gImVsZXBoYW50IikKYGBgCgpgYGB7ciBkYXRhIGNsZWFudXAgcmVwb3J0fQojIGZhc3QgcnQKZF9yYXdfc3R1ZHkxICU+JSAKICBmdWxsX2pvaW4oZF9yYXdfc3R1ZHkyKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJ0KSkgJT4lCiAgbXV0YXRlKHJ0X2NhdCA9IGlmZWxzZShydCA8IDI1MCwgIjwyNTBtcyIsICI+PTI1MG1zIikpICU+JSAKICBjb3VudChhZ2VfZ3JvdXAsIHJ0X2NhdCkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4pLCAyKSkKCiMgc2tpcHBlZCB0cmlhbHMKZF9yYXdfc3R1ZHkxICU+JSAKICBmdWxsX2pvaW4oZF9yYXdfc3R1ZHkyKSAlPiUKICBmaWx0ZXIoKGFnZSA+PSA3ICYgYWdlIDwgMTApIHwgKGFnZSA+PSAxOCkpICU+JQogIGZpbHRlcighaXMubmEocmVzcG9uc2UpLCAhcmVzcG9uc2UgJWluJSBjKCJiYWlsIiwgInNraXAiKSkgJT4lCiAgY291bnQoYWdlX2dyb3VwLCBzdWJpZCkgJT4lCiAgZmlsdGVyKG4gIT0gNDApICU+JQogIG11dGF0ZShza2lwcGVkID0gNDAgLSBuKSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXApICU+JQogIHN1bW1hcmlzZSh0b3RhbF9za2lwcGVkID0gc3VtKHNraXBwZWQpKQoKIyB0b3RhbCBtaXNpbmcKZDEgJT4lIAogIGZ1bGxfam9pbihkMikgJT4lCiAgZmlsdGVyKChhZ2UgPj0gNyAmIGFnZSA8IDEwKSB8IChhZ2UgPj0gMTgpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlKSwgIXJlc3BvbnNlICVpbiUgYygiYmFpbCIsICJza2lwIikpICU+JQogIGNvdW50KGFnZV9ncm91cCwgc3ViaWQpICU+JQogIGZpbHRlcihuICE9IDQwKSAlPiUKICBtdXRhdGUobWlzc2luZyA9IDQwIC0gbikgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwKSAlPiUKICBzdW1tYXJpc2UodG90YWxfbWlzc2luZyA9IHN1bShtaXNzaW5nKSwKICAgICAgICAgICAgcHJvcF9taXNzaW5nID0gcm91bmQodG90YWxfbWlzc2luZy8oNDAqMjAwKSwgMykpCmBgYAoKCmBgYHtyIGRhdGFmcmFtZXMgZm9yIGRpbWVuc2lvbiByZWR1Y2F0aW9ufQojIG1ha2UgZGF0YWZyYW1lcyBmb3IgczEKIyBkMV9iZWV0bGUgPC0gbWFrZURSREYoInN0dWR5IDEiLCAiYmVldGxlIikKIyBkMV9yb2JvdCA8LSBtYWtlRFJERigic3R1ZHkgMSIsICJyb2JvdCIpCmQxX2FsbCA8LSBtYWtlRFJERigic3R1ZHkgMSIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIGZvbGxvdy11cCBzdHVkaWVzIHRvIHMxCmQxYl9hbGwgPC0gbWFrZURSREYoInN0dWR5IDFiIiwgImFsbCIpCmQxY19hbGwgPC0gbWFrZURSREYoInN0dWR5IDFjIiwgImFsbCIpCgojIG1ha2UgZGF0YWZyYW1lcyBmb3Igc3R1ZHkgMgojIGQyX2JlZXRsZSA8LSBtYWtlRFJERigic3R1ZHkgMiIsICJiZWV0bGUiKQojIGQyX3JvYm90IDwtIG1ha2VEUkRGKCJzdHVkeSAyIiwgInJvYm90IikKZDJfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSAyIiwgImFsbCIpCmBgYAoKPHAgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjxhIGhyZWY9IiNoZWFkZXIiPmJhY2sgdG8gVE9DPC9hPjwvcD4KCiMgQW5hbHlzaXMgcGxhbgoKRm9yIGFsbCBzdHVkaWVzIHdlIGNvbmR1Y3QgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIHVzaW5nIFBlYXJzb24gY29ycmVsYXRpb25zIHRvIGZpbmQgbWluaW11bSByZXNpZHVhbCBzb2x1dGlvbnMuIAoKRm9yIGVhY2ggc3R1ZHksIHdlIGZpcnN0IGV4YW1pbmUgbWF4aW1hbCB1bnJvdGF0ZWQgYW5kIHJvdGF0ZWQgc29sdXRpb25zLiBUbyBkZXRlcm1pbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZhY3RvcnMgdG8gZXh0cmFjdCwgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcnVsZSBvZiB0aHVtYjogV2l0aCAkcCQgb2JzZXJ2YXRpb25zIHBlciBwYXJ0aWNpcGFudCwgd2UgY2FuIGV4dHJhY3QgYSBtYXhpbXVtIG9mICRrJCBmYWN0b3JzLCB3aGVyZSAkKHAtaykqMiA+IHArayQsIGkuZS4sICRrIDwgcC8zJC4gVGh1cywgd2l0aCA0MCBtZW50YWwgY2FwYWNpdHkgaXRlbXMsIHdlIGNhbiBleHRyYWN0IGEgbWF4aW11bSBvZiAxMyBmYWN0b3JzLgoKVG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmVzZXQgcmV0ZW50aW9uIGNyaXRlcmlhLCBjb25zaWRlcmluZyB0aGUgdW5yb3RhdGVkIG1heGltYWwgc29sdXRpb24gKHVubGVzcyBvdGhlcndpc2Ugbm90ZWQpOgoKICAtIEVhY2ggZmFjdG9yIG11c3QgaGF2ZSBhbiBlaWdlbnZhbHVlID4xLjAuCiAgLSBFYWNoIGZhY3RvciBtdXN0IGluZGl2aWR1YWxseSBhY2NvdW50IGZvciA+NSUgb2YgdGhlIHRvdGFsIHZhcmlhbmNlIGluIHRoZSBtYXhpbWFsIG1vZGVsLgogIC0gQWZ0ZXIgcm90YXRpb24sIGVhY2ggZmFjdG9yIG11c3QgYmUgdGhlIGRvbWluYW50IGZhY3RvciAoaS5lLiwgdGhlIGZhY3RvciB3aXRoIHRoZSBoaWdoZXN0IGZhY3RvciBsb2FkaW5nKSBmb3Ig4omlMSBtZW50YWwgY2FwYWNpdHkgaXRlbS4KCldlIHRoZW4gZXhhbWluZSBhbmQgaW50ZXJwcmV0IG9ibGltaW4tcm90YXRlZCBzb2x1dGlvbnMsIGV4dHJhY3Rpbmcgb25seSB0aGUgbnVtYmVyIG9mIGZhY3RvcnMgdGhhdCBtZWV0IHRoZXNlIGNyaXRlcmlhLgoKIyBBZHVsdHMKClN0dWR5IGluZm9ybWF0aW9uOgoKKiBEZXNpZ246IDIgY29uZGl0aW9ucyAoYmVldGxlLCByb2JvdCksIDMtcG9pbnQgcmVzcG9uc2Ugc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJoYXZlIGludGVudGlvbnMiCiogUG9wdWxhdGlvbjogYWR1bHRzCiogRGF0ZSBjb25kdWN0ZWQ6IDIwMTYtMDctMDYgKE1UdXJrKQoKIyMgRGVtb2dyYXBoaWNzCgpgYGB7ciBzMSBkZW1vZ3JhcGhpY3N9CiMgbWFrZSBkZW1vZ3JhcGhpY3MgdGFibGVzCmRlbW9TYW1wbGVTaXplKCJzdHVkeSAxIikKZGVtb0R1cmF0aW9uKCJzdHVkeSAxIikKZGVtb0FnZSgic3R1ZHkgMSIpCmRlbW9HZW5kZXIoInN0dWR5IDEiKQpkZW1vUmFjZSgic3R1ZHkgMSIpICU+JQogIGZpbHRlcihjaGFyYWN0ZXIgPT0gImFsbCIpICU+JQogIGdhdGhlcihldGhuaWNpdHksIGNvdW50LCAtY2hhcmFjdGVyKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKGNvdW50L3N1bShjb3VudCksIDIpKSAlPiUgCiAgYXJyYW5nZShkZXNjKHByb3ApKQpgYGAKCmBgYHtyIHMxIGRlbW9ncmFwaGljcyBieSBjb25kaXRpb259CiMgZ2VuZGVyCndpdGgoZDEgJT4lCiAgICAgICBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyLCBnZW5kZXIpICU+JQogICAgICAgZmlsdGVyKCFpcy5uYShnZW5kZXIpKSAlPiUKICAgICAgIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSksCiAgICAgdGFibGUoY2hhcmFjdGVyLCBnZW5kZXIpKSAlPiUKICBzdW1tYXJ5KCkKCiMgYWdlCndpdGgoZDEgJT4lCiAgICAgICBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyLCBhZ2UpLAogICAgIHQudGVzdChhZ2UgfiBjaGFyYWN0ZXIpKQpgYGAKCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48YSBocmVmPSIjaGVhZGVyIj5iYWNrIHRvIFRPQzwvYT48L3A+CgojIyBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMKCiMjIyBTdGVwIDE6IFJ1biBtYXhpbWFsIEVGQSAod2l0aG91dCBhbmQgd2l0aCByb3RhdGlvbikKCmBgYHtyIHMxIGFsbCBubyByb3RhdGlvbn0KIyBleGFtaW5lIHNjcmVlIHBsb3QKIyBmYS5wYXJhbGxlbChkMV9hbGwpCgojIHJ1biBFRkEgd2l0aG91dCByb3RhdGlvbiB3aXRoIE4gZmFjdG9ycwplZmFfZDFfYWxsX3Vucm90YXRlZCA8LSBmYShkMV9hbGwsIDEzLCByb3RhdGUgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCmZhLnNvcnQoZWZhX2QxX2FsbF91bnJvdGF0ZWQpCmBgYAoKYGBge3IgczEgaG93IG1hbnkgZmFjdG9ycyBwYXJ0IDEsIGluY2x1ZGUgPSBGfQojIGV4YW1pbmUgZWlnZW52YWx1ZXMgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZAplZmFfZDFfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyA8LSBwcmludChlZmFfZDFfYWxsX3Vucm90YXRlZCkkVmFjY291bnRlZCAlPiUKICB0KCkgJT4lCiAgZGF0YS5mcmFtZSgpCmBgYAoKYGBge3IgczEgaG93IG1hbnkgZmFjdG9ycyBwYXJ0IDJ9CiMgY291bnQgZmFjdG9ycyB3aXRoIGVpZ2VudmFsdWVzID4gMSBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkID4gNSUKZWZhX2QxX2FsbF91bnJvdGF0ZWRfbmZhY3RvcnMgPC0gZWZhX2QxX2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgJT4lCiAgZmlsdGVyKFNTLmxvYWRpbmdzID4gMSwgUHJvcG9ydGlvbi5FeHBsYWluZWQgPiAwLjA1KSAlPiUKICBjb3VudCgpICU+JQogIGFzLm51bWVyaWMoKQplZmFfZDFfYWxsX3Vucm90YXRlZF9uZmFjdG9ycwpgYGAKCmBgYHtyIHMxIGFsbCByb3RhdGVkLCBpbmNsdWRlID0gRn0KZWZhX2QxX2FsbF9yb3RhdGVkIDwtIGZhKGQxX2FsbCwgMTMsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCmZhLnNvcnQoZWZhX2QxX2FsbF9yb3RhdGVkKQpgYGAKCmBgYHtyIHMxIG4gcm90YXRlZH0KZWZhX2QxX3JvdGF0ZWROIDwtIGZhKGQxX2FsbCwgZWZhX2QxX2FsbF91bnJvdGF0ZWRfbmZhY3RvcnMsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCgojIGNoZWNrIHRoYXQgZWFjaCBvZiB0aGVzZSBmYWN0b3JzIGlzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIGF0IGxlYXN0IG9uZSBtZW50YWwgY2FwYWNpdHkgaXRlbQplZmFfZDFfcm90YXRlZE5fbG9hZGluZ3MgPC0gZmEuc29ydChsb2FkaW5ncyhlZmFfZDFfcm90YXRlZE4pW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICBtdXRhdGUobG9hZGluZ19hYnMgPSBhYnMobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nX2FicykgJT4lCiAgdW5ncm91cCgpCmVmYV9kMV9yb3RhdGVkTl9sb2FkaW5ncwoKIyBkcm9wIGFueSBmYWN0b3JzIHdoZXJlIG4gPCAxCmVmYV9kMV9yb3RhdGVkTl9sb2FkaW5ncyAlPiUgCiAgY291bnQoZmFjdG9yKSAlPiUgCiAgZmlsdGVyKG4gPiAwKQoKIyBzZXQgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZXh0cmFjdApuZmFjdG9yc19kMV9hbGwgPC0gZWZhX2QxX3JvdGF0ZWROX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApICU+JQogIG5yb3coKQpuZmFjdG9yc19kMV9hbGwKYGBgCgojIyMgU3RlcCAyOiBSdW4gRUZBIHdpdGggb2JsaW1pbiByb3RhdGlvbgoKYGBge3IgczEgYWxsIG9ibGltaW4gcm90YXRpb259CiMgcnVuIEVGQSB3aXRoIHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kMV9yb3RhdGVkTiA8LSBmYShkMV9hbGwsIG5mYWN0b3JzX2QxX2FsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuUm90VHlwZSwgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKZmEuc29ydChlZmFfZDFfcm90YXRlZE4pCgojIGdldCBsb2FkaW5ncyBmb3IgZWFjaCBmYWN0b3IKZWZhX2QxX3JvdGF0ZWROX2xvYWRpbmdzIDwtIGxvYWRpbmdzKGVmYV9kMV9yb3RhdGVkTilbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY2FwYWNpdHkiKQpgYGAKCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48YSBocmVmPSIjaGVhZGVyIj5iYWNrIHRvIFRPQzwvYT48L3A+CgojIyMjIEZhY3RvciBsb2FkaW5ncyB0YWJsZQoKYGBge3IgczEgbG9hZGluZ3MgdGFibGV9CmRhdGEuZnJhbWUobG9hZGluZ3MoZmEuc29ydChlZmFfZDFfcm90YXRlZE4pKVtdKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIk0iKSksIGZ1bnMocm91bmQyKSkKYGBgCgojIENoaWxkcmVuICg3LTl5KQoKU3R1ZHkgaW5mb3JtYXRpb246CgoqIERlc2lnbjogMiBjb25kaXRpb25zIChiZWV0bGUsIHJvYm90KSwgMy1wb2ludCByZXNwb25zZSBzY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgImhhdmUgaW50ZW50aW9ucyIKKiBQb3B1bGF0aW9uOiA3LTl5byBjaGlsZHJlbgoqIERhdGUgY29uZHVjdGVkOiBKdW5lIC0gRGVjZW1iZXIgMjAxNgoKIyMgRGVtb2dyYXBoaWNzCgpgYGB7ciBzMiBkZW1vZ3JhcGhpY3N9CiMgbWFrZSBkZW1vZ3JhcGhpY3MgdGFibGVzCmRlbW9TYW1wbGVTaXplKCJzdHVkeSAyIikKZGVtb0R1cmF0aW9uKCJzdHVkeSAyIikKZGVtb0FnZSgic3R1ZHkgMiIpCmRlbW9HZW5kZXIoInN0dWR5IDIiKQpkZW1vUmFjZSgic3R1ZHkgMiIpICU+JQogIGZpbHRlcihjaGFyYWN0ZXIgPT0gImFsbCIpICU+JQogIGdhdGhlcihldGhuaWNpdHksIGNvdW50LCAtY2hhcmFjdGVyKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKGNvdW50L3N1bShjb3VudCksIDIpKSAlPiUgCiAgYXJyYW5nZShkZXNjKHByb3ApKQpgYGAKCmBgYHtyIHMyIGRlbW9ncmFwaGljcyBieSBjb25kaXRpb259CiMgZ2VuZGVyCndpdGgoZDIgJT4lCiAgICAgICBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyLCBnZW5kZXIpICU+JQogICAgICAgZmlsdGVyKCFpcy5uYShnZW5kZXIpKSAlPiUKICAgICAgIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSksCiAgICAgdGFibGUoY2hhcmFjdGVyLCBnZW5kZXIpKSAlPiUKICBzdW1tYXJ5KCkKCiMgYWdlCndpdGgoZDIgJT4lCiAgICAgICBkaXN0aW5jdChzdWJpZCwgY2hhcmFjdGVyLCBhZ2UpLAogICAgIHQudGVzdChhZ2UgfiBjaGFyYWN0ZXIpKQpgYGAKCgo8cCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGEgaHJlZj0iI2hlYWRlciI+YmFjayB0byBUT0M8L2E+PC9wPgoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgojIyMgU3RlcCAxOiBSdW4gbWF4aW1hbCBFRkEgKHdpdGhvdXQgYW5kIHdpdGggcm90YXRpb24pCgpgYGB7ciBzMiBhbGwgbm8gcm90YXRpb259CiMgZXhhbWluZSBzY3JlZSBwbG90CiMgZmEucGFyYWxsZWwoZDJfYWxsKQoKIyBydW4gRUZBIHdpdGhvdXQgcm90YXRpb24gd2l0aCBOIGZhY3RvcnMKZWZhX2QyX2FsbF91bnJvdGF0ZWQgPC0gZmEoZDJfYWxsLCAxMywgcm90YXRlID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQpmYS5zb3J0KGVmYV9kMl9hbGxfdW5yb3RhdGVkKQpgYGAKCmBgYHtyIHMyIGhvdyBtYW55IGZhY3RvcnMgcGFydCAxLCBpbmNsdWRlID0gRkFMU0V9CiMgZXhhbWluZSBlaWdlbnZhbHVlcyBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkCmVmYV9kMl9hbGxfdW5yb3RhdGVkX2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9kMl9hbGxfdW5yb3RhdGVkKSRWYWNjb3VudGVkICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkKYGBgCgpgYGB7ciBzMiBob3cgbWFueSBmYWN0b3JzIHBhcnQgMn0KIyBjb3VudCBmYWN0b3JzIHdpdGggZWlnZW52YWx1ZXMgPiAxIGFuZCB2YXJpYW5jZSBleHBsYWluZWQgPiA1JQplZmFfZDJfYWxsX3Vucm90YXRlZF9uZmFjdG9ycyA8LSBlZmFfZDJfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9kMl9hbGxfdW5yb3RhdGVkX25mYWN0b3JzCmBgYAoKYGBge3IgczIgYWxsIHJvdGF0ZWQsIGluY2x1ZGUgPSBGQUxTRX0KZWZhX2QyX2FsbF9yb3RhdGVkIDwtIGZhKGQyX2FsbCwgMTMsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCmZhLnNvcnQoZWZhX2QyX2FsbF9yb3RhdGVkKQpgYGAKCmBgYHtyIHMyIG4gcm90YXRlZH0KZWZhX2QyX3JvdGF0ZWROIDwtIGZhKGQyX2FsbCwgZWZhX2QyX2FsbF91bnJvdGF0ZWRfbmZhY3RvcnMsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIpCgojIGNoZWNrIHRoYXQgZWFjaCBvZiB0aGVzZSBmYWN0b3JzIGlzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIGF0IGxlYXN0IG9uZSBtZW50YWwgY2FwYWNpdHkgaXRlbQplZmFfZDJfcm90YXRlZE5fbG9hZGluZ3MgPC0gZmEuc29ydChsb2FkaW5ncyhlZmFfZDJfcm90YXRlZE4pW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICBtdXRhdGUobG9hZGluZ19hYnMgPSBhYnMobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nX2FicykgJT4lCiAgdW5ncm91cCgpCmVmYV9kMl9yb3RhdGVkTl9sb2FkaW5ncwoKIyBkcm9wIGFueSBmYWN0b3JzIHdoZXJlIG4gPCAxCmVmYV9kMl9yb3RhdGVkTl9sb2FkaW5ncyAlPiUgCiAgY291bnQoZmFjdG9yKSAlPiUgCiAgZmlsdGVyKG4gPiAwKQoKIyBzZXQgbnVtYmVyIG9mIGZhY3RvcnMgdG8gZXh0cmFjdApuZmFjdG9yc19kMl9hbGwgPC0gZWZhX2QyX3JvdGF0ZWROX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApICU+JQogIG5yb3coKQpuZmFjdG9yc19kMl9hbGwKYGBgCgojIyMgU3RlcCAyOiBSdW4gRUZBIHdpdGggb2JsaW1pbiByb3RhdGlvbgoKYGBge3IgczIgYWxsIG9ibGltaW4gcm90YXRpb259CiMgcnVuIEVGQSB3aXRoIHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kMl9yb3RhdGVkTiA8LSBmYShkMl9hbGwsIG5mYWN0b3JzX2QyX2FsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuUm90VHlwZSwgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKZmEuc29ydChlZmFfZDJfcm90YXRlZE4pCgojIGdldCBsb2FkaW5ncyBmb3IgZWFjaCBmYWN0b3IKZWZhX2QyX3JvdGF0ZWROX2xvYWRpbmdzIDwtIGxvYWRpbmdzKGVmYV9kMl9yb3RhdGVkTilbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY2FwYWNpdHkiKQpgYGAKCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48YSBocmVmPSIjaGVhZGVyIj5iYWNrIHRvIFRPQzwvYT48L3A+CgojIyMjIEZhY3RvciBsb2FkaW5ncyB0YWJsZQoKYGBge3IgczIgbG9hZGluZ3MgdGFibGV9CmRhdGEuZnJhbWUobG9hZGluZ3MoZmEuc29ydChlZmFfZDJfcm90YXRlZE4pKVtdKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIk0iKSksIGZ1bnMocm91bmQyKSkKYGBgCgojIEJpZyBmYWN0b3IgbG9hZGluZ3MgdGFibGUKCmBgYHtyIGFsbCBzdHVkaWVzIGxvYWRpbmdzIHRhYmxlfQojIG1hbnVhbGx5IHNldCAzIGZhY3RvcnMKb3JkZXJfczFfbWFudWFsIDwtIGxvYWRpbmdzKGZhLnNvcnQoZmEoZDFfYWxsLCBuZmFjdG9ycyA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUpKSlbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIxX21hbnVhbCIpICU+JQogIHJlbmFtZShzMV9oZWFydCA9IE1SMSwgczFfYm9keSA9IE1SMiwgczFfbWluZCA9IE1SMykKCm9yZGVyX3MxIDwtIGxvYWRpbmdzKGZhLnNvcnQoZWZhX2QxX3JvdGF0ZWROKSlbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIxIikgJT4lCiAgcmVuYW1lKHMxX2hlYXJ0ID0gTVIxLCBzMV9ib2R5ID0gTVIyLCBzMV9taW5kID0gTVIzKQoKb3JkZXJfczIgPC0gbG9hZGluZ3MoZmEuc29ydChlZmFfZDJfcm90YXRlZE4pKVtdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gImNhcGFjaXR5IikgJT4lCiAgcmVuYW1lKHMyX2JvZHkgPSBNUjIsIHMyX2hlYXJ0ID0gTVIxLCBzMl9taW5kID0gTVIzKQoKYmlnVGFibGUgPC0gb3JkZXJfczEgJT4lIAogICMgb3JkZXJfczFfbWFudWFsICU+JSAjIGNvdWxkIHN1YnN0aXR1dGUKICBmdWxsX2pvaW4ob3JkZXJfczIpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJzIikpLCBmdW5zKHJvdW5kMikpICU+JQogIHNlbGVjdChvcmRlcjEsICMgY291bGQgc3ViaXN0aXR1dGUgb3JkZXJfczEKICAjIHNlbGVjdChvcmRlcjFfbWFudWFsLCAjIGNvdWxkIHN1YmlzdGl0dXRlIG9yZGVyX3MxCiAgICAgICAgIGNhcGFjaXR5LCBlbmRzX3dpdGgoImhlYXJ0IiksIGVuZHNfd2l0aCgiYm9keSIpLCBlbmRzX3dpdGgoIm1pbmQiKSkgCgpiaWdUYWJsZQpgYGAKCiMgRmlndXJlcwoKYGBge3IgcGxvdHRpbmcgc2V0dXAgY2hhcmFjdGVyIG1lYW5zLCBpbmNsdWRlID0gRn0KIyBib290c3RyYXAgOTUlIENJcyBmb3IgcmF0aW5ncyBieSBjaGFyYWN0ZXIgKG5vbnBhcmFtZXRyaWMpCiMgc3R1ZHkgMQpjaGFyX3Bsb3R0aW5nX3JhdGluZ3NfczEgPC0gZDEgJT4lIAogIHNlbGVjdChzdWJpZCwgY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogIGdyb3VwX2J5KGNoYXJhY3RlciwgY2FwYWNpdHkpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHJlc3BvbnNlTnVtKSkpKSAlPiUKICBmdWxsX2pvaW4oZGVtb1NhbXBsZVNpemUoInN0dWR5IDEiKSAlPiUgZmlsdGVyKGNoYXJhY3RlciAhPSAiYWxsIikpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAxIikKCiMgc3R1ZHkgMgpjaGFyX3Bsb3R0aW5nX3JhdGluZ3NfczIgPC0gZDIgJT4lIAogIHNlbGVjdChzdWJpZCwgY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogIGdyb3VwX2J5KGNoYXJhY3RlciwgY2FwYWNpdHkpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHJlc3BvbnNlTnVtKSkpKSAlPiUKICBmdWxsX2pvaW4oZGVtb1NhbXBsZVNpemUoInN0dWR5IDIiKSAlPiUgZmlsdGVyKGNoYXJhY3RlciAhPSAiYWxsIikpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAyIikKYGBgCgpgYGB7ciBwbG90dGluZyBzZXR1cCBjaGFyYWN0ZXIgbWVhbnMgbWVyZ2UsIGluY2x1ZGUgPSBGfQpjaGFyX3Bsb3R0aW5nX3JhdGluZ3NfYWxsIDwtIGNoYXJfcGxvdHRpbmdfcmF0aW5nc19zMSAlPiUKICBmdWxsX2pvaW4oY2hhcl9wbG90dGluZ19yYXRpbmdzX3MyKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGNoYXJhY3RlcikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSBmYWN0b3Ioc3R1ZHkpLAogICAgICAgICBjb25kaXRpb24gPSBmYWN0b3IoY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29tcHV0ZXIiLCAiZG9sbCIsICJ0ZWRkeV9iZWFyIiwgInJvYm90IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWV0bGUiLCAiYmlyZCIsICJtb3VzZSIsICJnb2F0IiwgImVsZXBoYW50IikpKQpgYGAKCmBgYHtyIHBsb3R0aW5nIHNldHVwIGNhcGFjaXR5IHdvcmRpbmdzLCBpbmNsdWRlID0gRn0KY2hhcl9wbG90dGluZ193b3JkaW5ncyA8LSBjaGFyX3Bsb3R0aW5nX3JhdGluZ3NfYWxsICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoY2FwYWNpdHkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZSh3b3JkaW5nID0gZmFjdG9yKAogICAgcmVjb2RlKGNhcGFjaXR5LAogICAgICAgICAgIGhhcHB5ID0gImZlZWwgaGFwcHkiLAogICAgICAgICAgIGRlcHJlc3NlZCA9ICJmZWVsIHNhZCIsCiAgICAgICAgICAgZmVhciA9ICJmZWVsIHNjYXJlZCIsCiAgICAgICAgICAgYW5ncnkgPSAiZ2V0IGFuZ3J5IiwKICAgICAgICAgICBjYWxtID0gImZlZWwgY2FsbSIsCiAgICAgICAgICAgc291bmRzID0gImhlYXIgc291bmRzIiwKICAgICAgICAgICBzZWVpbmcgPSAic2VlIHRoaW5ncyIsCiAgICAgICAgICAgdGVtcGVyYXR1cmUgPSAic2Vuc2UgdGVtcGVyYXR1cmVzIiwKICAgICAgICAgICBvZG9ycyA9ICJzbWVsbCB0aGluZ3MiLAogICAgICAgICAgIGRlcHRoID0gInNlbnNlLi4uIGNsb3NlIGJ5IG9yIGZhciBhd2F5IiwKICAgICAgICAgICBjb21wdXRhdGlvbnMgPSAiZG8gbWF0aCIsCiAgICAgICAgICAgdGhvdWdodHMgPSAiaGF2ZSB0aG91Z2h0cyIsCiAgICAgICAgICAgcmVhc29uaW5nID0gImZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaW5ncyIsCiAgICAgICAgICAgcmVtZW1iZXJpbmcgPSAicmVtZW1iZXIgdGhpbmdzIiwKICAgICAgICAgICBiZWxpZWZzID0gImhhdmUgYmVsaWVmcy4uLiIsCiAgICAgICAgICAgaHVuZ3J5ID0gImdldCBodW5ncnkiLAogICAgICAgICAgIHRpcmVkID0gImZlZWwgdGlyZWQiLAogICAgICAgICAgIHBhaW4gPSAiZmVlbCBwYWluIiwKICAgICAgICAgICBuYXVzZWF0ZWQgPSAiZmVlbCBzaWNrLi4uIiwKICAgICAgICAgICBzYWZlID0gImZlZWwgc2FmZSIsCiAgICAgICAgICAgbG92ZSA9ICJmZWVsIGxvdmUiLAogICAgICAgICAgIHJlY29nbml6aW5nID0gInJlY29nbml6ZSBzb21lYm9keSBlbHNlIiwKICAgICAgICAgICBjb21tdW5pY2F0aW5nID0gImNvbW11bmljYXRlIHdpdGggc29tZWJvZHkgZWxzZSIsCiAgICAgICAgICAgZ3VpbHQgPSAiZmVlbCBndWlsdHkiLAogICAgICAgICAgIGRpc3Jlc3BlY3RlZCA9ICJnZXQgaHVydCBmZWVsaW5ncyIsCiAgICAgICAgICAgZnJlZV93aWxsID0gImRlY2lkZSB3aGF0IHRvIGRvIiwKICAgICAgICAgICBjaG9pY2VzID0gIm1ha2UgY2hvaWNlcyIsCiAgICAgICAgICAgc2VsZl9yZXN0cmFpbnQgPSAiaGF2ZSBzZWxmLWNvbnRyb2wuLi4iLAogICAgICAgICAgIGludGVudGlvbnMgPSAibWFrZSBwbGFucyIsCiAgICAgICAgICAgZ29hbCA9ICJoYXZlIGdvYWxzLi4uIiwKICAgICAgICAgICBjb25zY2lvdXMgPSAiYmUgYXdhcmUgb2YgdGhpbmdzIiwKICAgICAgICAgICBzZWxmX2F3YXJlID0gImJlIGF3YXJlIG9mIGl0c2VsZiIsCiAgICAgICAgICAgZGVzaXJlcyA9ICJoYXZlIGRlc2lyZXMuLi4iLAogICAgICAgICAgIGVtYmFycmFzc2VkID0gImZlZWwgZW1iYXJyYXNzZWQiLAogICAgICAgICAgIGVtb19yZWNvZyA9ICJ1bmRlcnN0YW5kIGhvdyBzb21lYm9keSBlbHNlIGlzIGZlZWxpbmciLAogICAgICAgICAgIGpveSA9ICJmZWVsIGpveSIsCiAgICAgICAgICAgbW9yYWxpdHkgPSAia25vdyB3aGF0J3MgbmljZSBhbmQgd2hhdCdzIG1lYW4iLAogICAgICAgICAgIHBlcnNvbmFsaXR5ID0gImhhdmUgYSBwZXJzb25hbGl0eS4uLiIsCiAgICAgICAgICAgcGxlYXN1cmUgPSAiZmVlbCBwbGVhc3VyZS4uLiIsCiAgICAgICAgICAgcHJpZGUgPSAiZmVlbCBwcm91ZCIpKSkKYGBgCgpgYGB7ciBwbG90dGluZyBzZXR1cCBsb2FkaW5ncywgaW5jbHVkZSA9IEZ9CiMgbWVyZ2Ugd2l0aCBsb2FkaW5ncywgb3JkZXJpbmdzLCBhbmQgZG9taW5hbnQgZmFjdG9ycyBmcm9tIGVhY2ggc3R1ZHkgCmNoYXJfcGxvdHRpbmcgPC0gY2hhcl9wbG90dGluZ19yYXRpbmdzX2FsbCAlPiUKICBmdWxsX2pvaW4oY2hhcl9wbG90dGluZ193b3JkaW5ncykgJT4lCiAgZnVsbF9qb2luKG9yZGVyX3MxICU+JQogICAgICAgICAgICAgIHJlbmFtZShzMV9NUjEgPSBzMV9ib2R5LCBzMV9NUjIgPSBzMV9oZWFydCwgczFfTVIzID0gczFfbWluZCkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHMxX01SMV9hYnMgPSBhYnMoczFfTVIxKSwKICAgICAgICAgICAgICAgICAgICAgczFfTVIyX2FicyA9IGFicyhzMV9NUjIpLAogICAgICAgICAgICAgICAgICAgICBzMV9NUjNfYWJzID0gYWJzKHMxX01SMyksCiAgICAgICAgICAgICAgICAgICAgIHMxX2ZhY3RvciA9IAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzMV9NUjFfYWJzID4gczFfTVIyX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczFfTVIxX2FicyA+IHMxX01SM19hYnMsICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHMxX01SMl9hYnMgPiBzMV9NUjFfYWJzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczFfTVIyX2FicyA+IHMxX01SM19hYnMsICJIRUFSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoczFfTVIzX2FicyA+IHMxX01SMV9hYnMgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczFfTVIzX2FicyA+IHMxX01SMl9hYnMsICJNSU5EIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgICAgICAgICAgICAgICAgICAgczFfY29sb3IgPSByZWNvZGUoczFfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk9EWSIgPSAiI0U0MUExQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUFSVCIgPSAiIzM3N0VCOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSU5EIiA9ICIjNERBRjRBIiksCiAgICAgICAgICAgICAgICAgICAgIHMxX29yZGVyID0gYXMubnVtZXJpYyhvcmRlcjEpKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLXMxX01SMV9hYnMsIC1zMV9NUjJfYWJzLCAtczFfTVIzX2FicykpICU+JQogIGZ1bGxfam9pbihvcmRlcl9zMiAlPiUKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKHMyX01SMSA9IHMyX2hlYXJ0LCBzMl9NUjIgPSBzMl9ib2R5LCBzMl9NUjMgPSBzMl9taW5kKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoczJfTVIxX2FicyA9IGFicyhzMl9NUjEpLAogICAgICAgICAgICAgICAgICAgICBzMl9NUjJfYWJzID0gYWJzKHMyX01SMiksCiAgICAgICAgICAgICAgICAgICAgIHMyX01SM19hYnMgPSBhYnMoczJfTVIzKSwKICAgICAgICAgICAgICAgICAgICAgczJfZmFjdG9yID0gCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHMyX01SMV9hYnMgPiBzMl9NUjJfYWJzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMl9NUjFfYWJzID4gczJfTVIzX2FicywgIkJPRFkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoczJfTVIyX2FicyA+IHMyX01SMV9hYnMgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMl9NUjJfYWJzID4gczJfTVIzX2FicywgIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzMl9NUjNfYWJzID4gczJfTVIxX2FicyAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMl9NUjNfYWJzID4gczJfTVIyX2FicywgIk1JTkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICAgICAgICAgICAgICBzMl9jb2xvciA9IHJlY29kZShzMl9mYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZIiA9ICIjRTQxQTFDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhFQVJUIiA9ICIjMzc3RUI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JTkQiID0gIiM0REFGNEEiKSkgJT4lCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzMl9vcmRlciIpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzMl9vcmRlciA9IGFzLm51bWVyaWMoczJfb3JkZXIpKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoLXMyX01SMV9hYnMsIC1zMl9NUjJfYWJzLCAtczJfTVIzX2FicykpCgojIGNvbmZpZ3VyZSBwbG90IGxhYmVscwpsYWJlbF9kZl9zMSA8LSBjaGFyX3Bsb3R0aW5nICU+JSBmaWx0ZXIoc3R1ZHkgPT0gInN0dWR5IDEiKSAlPiUgc2VsZWN0KGNvbmRpdGlvbiwgbikgJT4lIHVuaXF1ZSgpCmxhYmVsX2RmX3MyIDwtIGNoYXJfcGxvdHRpbmcgJT4lIGZpbHRlcihzdHVkeSA9PSAic3R1ZHkgMiIpICU+JSBzZWxlY3QoY29uZGl0aW9uLCBuKSAlPiUgdW5pcXVlKCkKCmZhY2V0TGFic19zMSA8LSBnc3ViKCIgXFwoIiwgIlxuKCIsIG1ha2VGYWNldExhYnMoY2hhcl9wbG90dGluZyAlPiUgZmlsdGVyKHN0dWR5ID09ICJzdHVkeSAxIikpKQpmYWNldExhYnNfczIgPC0gZ3N1YigiIFxcKCIsICJcbigiLCBtYWtlRmFjZXRMYWJzKGNoYXJfcGxvdHRpbmcgJT4lIGZpbHRlcihzdHVkeSA9PSAic3R1ZHkgMiIpKSkKCiMgY29uZmlndXJlIGN1c3RvbSBwYWxldHRlCm15UGFsZXR0ZSA8LSBicmV3ZXIucGFsKDMsICJTZXQxIik7IG5hbWVzKG15UGFsZXR0ZSkgPC0gYygiSEVBUlQiLCAiQk9EWSIsICJNSU5EIikKCnBhbGV0dGVfYmFzZSA8LSBjaGFyX3Bsb3R0aW5nICU+JSAKICBzZWxlY3QoY2FwYWNpdHksIGVuZHNfd2l0aCgiX2ZhY3RvciIpKSAlPiUKICBkaXN0aW5jdCgpCiMgYWRqdXN0IGJ5IGhhbmQgZGVwZW5kaW5nIG9uIG9yZGVyIG9mIGZhY3RvcnMhIQpwYWxldHRlX3MxIDwtIGMocmVwKG15UGFsZXR0ZVsiTUlORCJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzMV9mYWN0b3IgPT0gIk1JTkQiKSAlPiUgY291bnQoKSksCiAgICAgICAgICAgICAgICByZXAobXlQYWxldHRlWyJIRUFSVCJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzMV9mYWN0b3IgPT0gIkhFQVJUIikgJT4lIGNvdW50KCkpLAogICAgICAgICAgICAgICAgcmVwKG15UGFsZXR0ZVsiQk9EWSJdLCBwYWxldHRlX2Jhc2UgJT4lIGZpbHRlcihzMV9mYWN0b3IgPT0gIkJPRFkiKSAlPiUgY291bnQoKSkpCnBhbGV0dGVfczIgPC0gYyhyZXAobXlQYWxldHRlWyJNSU5EIl0sIHBhbGV0dGVfYmFzZSAlPiUgZmlsdGVyKHMyX2ZhY3RvciA9PSAiTUlORCIpICU+JSBjb3VudCgpKSwKICAgICAgICAgICAgICAgIHJlcChteVBhbGV0dGVbIkJPRFkiXSwgcGFsZXR0ZV9iYXNlICU+JSBmaWx0ZXIoczJfZmFjdG9yID09ICJCT0RZIikgJT4lIGNvdW50KCkpLAogICAgICAgICAgICAgICAgcmVwKG15UGFsZXR0ZVsiSEVBUlQiXSwgcGFsZXR0ZV9iYXNlICU+JSBmaWx0ZXIoczJfZmFjdG9yID09ICJIRUFSVCIpICU+JSBjb3VudCgpKSkKYGBgCgojIyAzRCBzY2F0dGVycGxvdHMKCkZhY3RvciBsb2FkaW5ncyBmb3IgdGhlIDQwIG1lbnRhbCBjYXBhY2l0aWVzIG9uIHRoZSB0aHJlZSByb3RhdGVkIGZhY3RvcnMgaW4gU3R1ZHkgMS4gSXRlbXMgYXJlIGNvbG9yZWQgYnkgdGhlaXIgZG9taW5hbnQgZmFjdG9yIGxvYWRpbmc6IEl0ZW1zIHRoYXQgbG9hZGVkIG1vc3Qgc3Ryb25nbHkgb24gdGhlIGJvZHkgZmFjdG9yIChib2RpbHkgc3RhdGVzIGFuZCB3aWxsKSBhcmUgaW4gcmVkOyBpdGVtcyB0aGF0IGxvYWRlZCBtb3N0IHN0cm9uZ2x5IG9uIHRoZSBoZWFydCBmYWN0b3IgKHNvY2lhbC1lbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIG1vcmFsaXR5KSBhcmUgaW4gYmx1ZTsgYW5kIGl0ZW1zIHRoYXQgbG9hZGVkIG1vc3Qgc3Ryb25nbHkgb24gdGhlIG1pbmQgZmFjdG9yIChwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgYW5kIGdvYWwgcHVyc3VpdCkgYXJlIGluIGdyZWVuLgoKIyMjIFN0dWR5IDEgKGFkdWx0cykKCmBgYHtyIGZpZ3VyZSAzZCBzY2F0dGVyIHMxfQojIHNldCB1cCBsYWJlbHMgZm9yIHBsb3QgKHNob3J0ZW5lZCB2ZXJzaW9uIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcykKd29yZGluZ19zMSA8LSBsb2FkaW5ncyhlZmFfZDFfcm90YXRlZE4pW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiaXRlbSIpICU+JQogIHNlbGVjdChpdGVtKSAlPiUKICBtdXRhdGUod29yZGluZyA9IGZhY3RvcigKICAgIHJlY29kZShpdGVtLAogICAgICAgICAgIGhhcHB5ID0gImZlZWwgaGFwcHkiLAogICAgICAgICAgIGRlcHJlc3NlZCA9ICJmZWVsIHNhZCIsCiAgICAgICAgICAgZmVhciA9ICJmZWVsIHNjYXJlZCIsCiAgICAgICAgICAgYW5ncnkgPSAiZ2V0IGFuZ3J5IiwKICAgICAgICAgICBjYWxtID0gImZlZWwgY2FsbSIsCiAgICAgICAgICAgc291bmRzID0gImhlYXIgc291bmRzIiwKICAgICAgICAgICBzZWVpbmcgPSAic2VlIHRoaW5ncyIsCiAgICAgICAgICAgdGVtcGVyYXR1cmUgPSAic2Vuc2UgdGVtcGVyYXR1cmVzIiwKICAgICAgICAgICBvZG9ycyA9ICJzbWVsbCB0aGluZ3MiLAogICAgICAgICAgIGRlcHRoID0gInNlbnNlIHdoZXRoZXIgc29tZXRoaW5nIGlzIGNsb3NlIGJ5IG9yIGZhciBhd2F5IiwKICAgICAgICAgICBjb21wdXRhdGlvbnMgPSAiZG8gbWF0aCIsCiAgICAgICAgICAgdGhvdWdodHMgPSAiaGF2ZSB0aG91Z2h0cyIsCiAgICAgICAgICAgcmVhc29uaW5nID0gImZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaW5ncyIsCiAgICAgICAgICAgcmVtZW1iZXJpbmcgPSAicmVtZW1iZXIgdGhpbmdzIiwKICAgICAgICAgICBiZWxpZWZzID0gImhhdmUgYmVsaWVmcywgbGlrZSB3aGVuIHlvdSB0aGluayBzb21ldGhpbmcgaXMgdHJ1ZSIsCiAgICAgICAgICAgaHVuZ3J5ID0gImdldCBodW5ncnkiLAogICAgICAgICAgIHRpcmVkID0gImZlZWwgdGlyZWQiLAogICAgICAgICAgIHBhaW4gPSAiZmVlbCBwYWluIiwKICAgICAgICAgICBuYXVzZWF0ZWQgPSAiZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdGhyb3cgdXAiLAogICAgICAgICAgIHNhZmUgPSAiZmVlbCBzYWZlIiwKICAgICAgICAgICBsb3ZlID0gImZlZWwgbG92ZSIsCiAgICAgICAgICAgcmVjb2duaXppbmcgPSAicmVjb2duaXplIHNvbWVib2R5IGVsc2UiLAogICAgICAgICAgIGNvbW11bmljYXRpbmcgPSAiY29tbXVuaWNhdGUgd2l0aCBzb21lYm9keSBlbHNlIiwKICAgICAgICAgICBndWlsdCA9ICJmZWVsIGd1aWx0eSIsCiAgICAgICAgICAgZGlzcmVzcGVjdGVkID0gImdldCBodXJ0IGZlZWxpbmdzIiwKICAgICAgICAgICBmcmVlX3dpbGwgPSAiZGVjaWRlIHdoYXQgdG8gZG8iLAogICAgICAgICAgIGNob2ljZXMgPSAibWFrZSBjaG9pY2VzIiwKICAgICAgICAgICBzZWxmX3Jlc3RyYWludCA9ICJoYXZlIHNlbGYtY29udHJvbCwgbGlrZSB3aGVuIHlvdSBzdG9wIHlvdXJzZWxmIGZyb20gZG9pbmcgc29tZXRoaW5nIHlvdSBzaG91bGRuJ3QgZG8iLAogICAgICAgICAgIGludGVudGlvbnMgPSAibWFrZSBwbGFucyIsCiAgICAgICAgICAgZ29hbCA9ICJoYXZlIGdvYWxzLCBsaWtlIHdoZW4geW91J3JlIHdvcmtpbmcgaGFyZCB0byBkbyBzb21ldGhpbmcgb3IgbWFrZSBzb21ldGhpbmcgaGFwcGVuIiwKICAgICAgICAgICBjb25zY2lvdXMgPSAiYmUgYXdhcmUgb2YgdGhpbmdzIiwKICAgICAgICAgICBzZWxmX2F3YXJlID0gImJlIGF3YXJlIG9mIGl0c2VsZiIsCiAgICAgICAgICAgZGVzaXJlcyA9ICJoYXZlIGRlc2lyZXMsIGxpa2Ugd2hlbiB5b3UgcmVhbGx5IHdhbnQgc29tZXRoaW5nIiwKICAgICAgICAgICBlbWJhcnJhc3NlZCA9ICJmZWVsIGVtYmFycmFzc2VkIiwKICAgICAgICAgICBlbW9fcmVjb2cgPSAidW5kZXJzdGFuZCBob3cgc29tZWJvZHkgZWxzZSBpcyBmZWVsaW5nIiwKICAgICAgICAgICBqb3kgPSAiZmVlbCBqb3kiLAogICAgICAgICAgIG1vcmFsaXR5ID0gImtub3cgd2hhdCdzIG5pY2UgYW5kIHdoYXQncyBtZWFuIiwKICAgICAgICAgICBwZXJzb25hbGl0eSA9ICJoYXZlIGEgcGVyc29uYWxpdHksIGxpa2Ugd2hlbiBzb21lb25lIGlzIHNoeSBhbmQgc29tZWJvZHkgZWxzZSBpcyBzaWxseSIsCiAgICAgICAgICAgcGxlYXN1cmUgPSAiZmVlbCBwbGVhc3VyZSwgbGlrZSB3aGVuIHNvbWV0aGluZyBmZWVscyByZWFsbHkgZ29vZCIsCiAgICAgICAgICAgcHJpZGUgPSAiZmVlbCBwcm91ZCIpKSkgJT4lCiAgICBtdXRhdGUoc2hvcnQgPSBmYWN0b3IoCiAgICAgIHJlY29kZShpdGVtLAogICAgICAgICAgICAgaGFwcHkgPSAiaGFwcHkiLAogICAgICAgICAgICAgZGVwcmVzc2VkID0gInNhZCIsCiAgICAgICAgICAgZmVhciA9ICJzY2FyZWQiLAogICAgICAgICAgIGFuZ3J5ID0gImFuZ3J5IiwKICAgICAgICAgICBjYWxtID0gImNhbG0iLAogICAgICAgICAgIHNvdW5kcyA9ICJoZWFyIiwKICAgICAgICAgICBzZWVpbmcgPSAic2VlIiwKICAgICAgICAgICB0ZW1wZXJhdHVyZSA9ICJ0ZW1wZXJhdHVyZXMiLAogICAgICAgICAgIG9kb3JzID0gInNtZWxsIiwKICAgICAgICAgICBkZXB0aCA9ICJkZXB0aCIsCiAgICAgICAgICAgY29tcHV0YXRpb25zID0gIm1hdGgiLAogICAgICAgICAgIHRob3VnaHRzID0gInRob3VnaHRzIiwKICAgICAgICAgICByZWFzb25pbmcgPSAiZmlndXJlIG91dCIsCiAgICAgICAgICAgcmVtZW1iZXJpbmcgPSAicmVtZW1iZXIiLAogICAgICAgICAgIGJlbGllZnMgPSAiYmVsaWVmcyIsCiAgICAgICAgICAgaHVuZ3J5ID0gImh1bmdyeSIsCiAgICAgICAgICAgdGlyZWQgPSAidGlyZWQiLAogICAgICAgICAgIHBhaW4gPSAicGFpbiIsCiAgICAgICAgICAgbmF1c2VhdGVkID0gInNpY2siLAogICAgICAgICAgIHNhZmUgPSAic2FmZSIsCiAgICAgICAgICAgbG92ZSA9ICJsb3ZlIiwKICAgICAgICAgICByZWNvZ25pemluZyA9ICJyZWNvZ25pemUiLAogICAgICAgICAgIGNvbW11bmljYXRpbmcgPSAiY29tbXVuaWNhdGUiLAogICAgICAgICAgIGd1aWx0ID0gImd1aWx0eSIsCiAgICAgICAgICAgZGlzcmVzcGVjdGVkID0gImh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgIGZyZWVfd2lsbCA9ICJkZWNpZGUiLAogICAgICAgICAgIGNob2ljZXMgPSAiY2hvaWNlcyIsCiAgICAgICAgICAgc2VsZl9yZXN0cmFpbnQgPSAic2VsZi1jb250cm9sIiwKICAgICAgICAgICBpbnRlbnRpb25zID0gInBsYW5zIiwKICAgICAgICAgICBnb2FsID0gImdvYWxzIiwKICAgICAgICAgICBjb25zY2lvdXMgPSAiYXdhcmUiLAogICAgICAgICAgIHNlbGZfYXdhcmUgPSAic2VsZi1hd2FyZSIsCiAgICAgICAgICAgZGVzaXJlcyA9ICJkZXNpcmVzIiwKICAgICAgICAgICBlbWJhcnJhc3NlZCA9ICJlbWJhcnJhc3NlZCIsCiAgICAgICAgICAgZW1vX3JlY29nID0gImVtcGF0aHkiLAogICAgICAgICAgIGpveSA9ICJqb3kiLAogICAgICAgICAgIG1vcmFsaXR5ID0gIm1vcmFsaXR5IiwKICAgICAgICAgICBwZXJzb25hbGl0eSA9ICJwZXJzb25hbGl0eSIsCiAgICAgICAgICAgcGxlYXN1cmUgPSAicGxlYXN1cmUiLAogICAgICAgICAgIHByaWRlID0gInByaWRlIikpKQoKIyBtYWtlIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcKc2NhdHRlcl9wbG90dGluZyA8LSBsb2FkaW5ncyhlZmFfZDFfcm90YXRlZE4pW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiaXRlbSIpICU+JQogIHJlbmFtZShIRUFSVCA9IE1SMSwKICAgICAgICAgQk9EWSA9IE1SMiwKICAgICAgICAgTUlORCA9IE1SMykgJT4lCiAgZnVsbF9qb2luKHdvcmRpbmdfczEpICU+JQogIG11dGF0ZShkb21pbmFudCA9IGZhY3RvcigKICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoQk9EWSksICJCT0RZIiwKICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEhFQVJUKSwgIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhNSU5EKSwgIk1JTkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpLAogICAgc2l6ZSA9IGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoQk9EWSksIGFicyhCT0RZKSwKICAgICAgICAgICAgICAgICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhIRUFSVCksIGFicyhIRUFSVCksCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKE1JTkQpLCBhYnMoTUlORCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICBjb2xvciA9IGlmZWxzZShkb21pbmFudCA9PSAiQk9EWSIsICIjRTQxQTFDIiwKICAgICAgICAgICAgICAgICAgIGlmZWxzZShkb21pbmFudCA9PSAiSEVBUlQiLCAiIzM3N0VCOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRvbWluYW50ID09ICJNSU5EIiwgIiM0REFGNEEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkKCiMgcGxvdCEKZmlnUzEgPC0gcGxvdF9seShzY2F0dGVyX3Bsb3R0aW5nLCB4ID0gfkhFQVJULCB5ID0gfkJPRFksIHogPSB+TUlORCwKICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgIGNvbG9yID0gfmRvbWluYW50LCBjb2xvcnMgPSBjKCIjRTQxQTFDIiwgIiMzNzdFQjgiLCAiIzREQUY0QSIpLAogICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gNCksCiAgICAgICAgICAgICB0ZXh0ID0gfnNob3J0LAogICAgICAgICAgICAgdGV4dGZvbnQgPSBsaXN0KHNpemUgPSAxNSksCiAgICAgICAgICAgICBtb2RlID0gInRleHQrbWFya2VycyIsCiAgICAgICAgICAgICBzaG93bGVnZW5kID0gVFJVRSkKCmZpZ1MxCmBgYAoKIyMjIFN0dWR5IDIgKDctOXlvKQoKYGBge3IgZmlndXJlIDNkIHNjYXR0ZXIgczJ9CiMgc2V0IHVwIGxhYmVscyBmb3IgcGxvdCAoc2hvcnRlbmVkIHZlcnNpb24gb2YgbWVudGFsIGNhcGFjaXR5IGl0ZW1zKQp3b3JkaW5nX3MyIDwtIGxvYWRpbmdzKGVmYV9kMl9yb3RhdGVkTilbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgc2VsZWN0KGl0ZW0pICU+JQogIG11dGF0ZSh3b3JkaW5nID0gZmFjdG9yKAogICAgcmVjb2RlKGl0ZW0sCiAgICAgICAgICAgaGFwcHkgPSAiZmVlbCBoYXBweSIsCiAgICAgICAgICAgZGVwcmVzc2VkID0gImZlZWwgc2FkIiwKICAgICAgICAgICBmZWFyID0gImZlZWwgc2NhcmVkIiwKICAgICAgICAgICBhbmdyeSA9ICJnZXQgYW5ncnkiLAogICAgICAgICAgIGNhbG0gPSAiZmVlbCBjYWxtIiwKICAgICAgICAgICBzb3VuZHMgPSAiaGVhciBzb3VuZHMiLAogICAgICAgICAgIHNlZWluZyA9ICJzZWUgdGhpbmdzIiwKICAgICAgICAgICB0ZW1wZXJhdHVyZSA9ICJzZW5zZSB0ZW1wZXJhdHVyZXMiLAogICAgICAgICAgIG9kb3JzID0gInNtZWxsIHRoaW5ncyIsCiAgICAgICAgICAgZGVwdGggPSAic2Vuc2Ugd2hldGhlciBzb21ldGhpbmcgaXMgY2xvc2UgYnkgb3IgZmFyIGF3YXkiLAogICAgICAgICAgIGNvbXB1dGF0aW9ucyA9ICJkbyBtYXRoIiwKICAgICAgICAgICB0aG91Z2h0cyA9ICJoYXZlIHRob3VnaHRzIiwKICAgICAgICAgICByZWFzb25pbmcgPSAiZmlndXJlIG91dCBob3cgdG8gZG8gdGhpbmdzIiwKICAgICAgICAgICByZW1lbWJlcmluZyA9ICJyZW1lbWJlciB0aGluZ3MiLAogICAgICAgICAgIGJlbGllZnMgPSAiaGF2ZSBiZWxpZWZzLCBsaWtlIHdoZW4geW91IHRoaW5rIHNvbWV0aGluZyBpcyB0cnVlIiwKICAgICAgICAgICBodW5ncnkgPSAiZ2V0IGh1bmdyeSIsCiAgICAgICAgICAgdGlyZWQgPSAiZmVlbCB0aXJlZCIsCiAgICAgICAgICAgcGFpbiA9ICJmZWVsIHBhaW4iLAogICAgICAgICAgIG5hdXNlYXRlZCA9ICJmZWVsIHNpY2ssIGxpa2Ugd2hlbiB5b3UgZmVlbCBsaWtlIHlvdSBtaWdodCB0aHJvdyB1cCIsCiAgICAgICAgICAgc2FmZSA9ICJmZWVsIHNhZmUiLAogICAgICAgICAgIGxvdmUgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICByZWNvZ25pemluZyA9ICJyZWNvZ25pemUgc29tZWJvZHkgZWxzZSIsCiAgICAgICAgICAgY29tbXVuaWNhdGluZyA9ICJjb21tdW5pY2F0ZSB3aXRoIHNvbWVib2R5IGVsc2UiLAogICAgICAgICAgIGd1aWx0ID0gImZlZWwgZ3VpbHR5IiwKICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgIGZyZWVfd2lsbCA9ICJkZWNpZGUgd2hhdCB0byBkbyIsCiAgICAgICAgICAgY2hvaWNlcyA9ICJtYWtlIGNob2ljZXMiLAogICAgICAgICAgIHNlbGZfcmVzdHJhaW50ID0gImhhdmUgc2VsZi1jb250cm9sLCBsaWtlIHdoZW4geW91IHN0b3AgeW91cnNlbGYgZnJvbSBkb2luZyBzb21ldGhpbmcgeW91IHNob3VsZG4ndCBkbyIsCiAgICAgICAgICAgaW50ZW50aW9ucyA9ICJtYWtlIHBsYW5zIiwKICAgICAgICAgICBnb2FsID0gImhhdmUgZ29hbHMsIGxpa2Ugd2hlbiB5b3UncmUgd29ya2luZyBoYXJkIHRvIGRvIHNvbWV0aGluZyBvciBtYWtlIHNvbWV0aGluZyBoYXBwZW4iLAogICAgICAgICAgIGNvbnNjaW91cyA9ICJiZSBhd2FyZSBvZiB0aGluZ3MiLAogICAgICAgICAgIHNlbGZfYXdhcmUgPSAiYmUgYXdhcmUgb2YgaXRzZWxmIiwKICAgICAgICAgICBkZXNpcmVzID0gImhhdmUgZGVzaXJlcywgbGlrZSB3aGVuIHlvdSByZWFsbHkgd2FudCBzb21ldGhpbmciLAogICAgICAgICAgIGVtYmFycmFzc2VkID0gImZlZWwgZW1iYXJyYXNzZWQiLAogICAgICAgICAgIGVtb19yZWNvZyA9ICJ1bmRlcnN0YW5kIGhvdyBzb21lYm9keSBlbHNlIGlzIGZlZWxpbmciLAogICAgICAgICAgIGpveSA9ICJmZWVsIGpveSIsCiAgICAgICAgICAgbW9yYWxpdHkgPSAia25vdyB3aGF0J3MgbmljZSBhbmQgd2hhdCdzIG1lYW4iLAogICAgICAgICAgIHBlcnNvbmFsaXR5ID0gImhhdmUgYSBwZXJzb25hbGl0eSwgbGlrZSB3aGVuIHNvbWVvbmUgaXMgc2h5IGFuZCBzb21lYm9keSBlbHNlIGlzIHNpbGx5IiwKICAgICAgICAgICBwbGVhc3VyZSA9ICJmZWVsIHBsZWFzdXJlLCBsaWtlIHdoZW4gc29tZXRoaW5nIGZlZWxzIHJlYWxseSBnb29kIiwKICAgICAgICAgICBwcmlkZSA9ICJmZWVsIHByb3VkIikpKSAlPiUKICAgIG11dGF0ZShzaG9ydCA9IGZhY3RvcigKICAgICAgcmVjb2RlKGl0ZW0sCiAgICAgICAgICAgICBoYXBweSA9ICJoYXBweSIsCiAgICAgICAgICAgICBkZXByZXNzZWQgPSAic2FkIiwKICAgICAgICAgICBmZWFyID0gInNjYXJlZCIsCiAgICAgICAgICAgYW5ncnkgPSAiYW5ncnkiLAogICAgICAgICAgIGNhbG0gPSAiY2FsbSIsCiAgICAgICAgICAgc291bmRzID0gImhlYXIiLAogICAgICAgICAgIHNlZWluZyA9ICJzZWUiLAogICAgICAgICAgIHRlbXBlcmF0dXJlID0gInRlbXBlcmF0dXJlcyIsCiAgICAgICAgICAgb2RvcnMgPSAic21lbGwiLAogICAgICAgICAgIGRlcHRoID0gImRlcHRoIiwKICAgICAgICAgICBjb21wdXRhdGlvbnMgPSAibWF0aCIsCiAgICAgICAgICAgdGhvdWdodHMgPSAidGhvdWdodHMiLAogICAgICAgICAgIHJlYXNvbmluZyA9ICJmaWd1cmUgb3V0IiwKICAgICAgICAgICByZW1lbWJlcmluZyA9ICJyZW1lbWJlciIsCiAgICAgICAgICAgYmVsaWVmcyA9ICJiZWxpZWZzIiwKICAgICAgICAgICBodW5ncnkgPSAiaHVuZ3J5IiwKICAgICAgICAgICB0aXJlZCA9ICJ0aXJlZCIsCiAgICAgICAgICAgcGFpbiA9ICJwYWluIiwKICAgICAgICAgICBuYXVzZWF0ZWQgPSAic2ljayIsCiAgICAgICAgICAgc2FmZSA9ICJzYWZlIiwKICAgICAgICAgICBsb3ZlID0gImxvdmUiLAogICAgICAgICAgIHJlY29nbml6aW5nID0gInJlY29nbml6ZSIsCiAgICAgICAgICAgY29tbXVuaWNhdGluZyA9ICJjb21tdW5pY2F0ZSIsCiAgICAgICAgICAgZ3VpbHQgPSAiZ3VpbHR5IiwKICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiaHVydCBmZWVsaW5ncyIsCiAgICAgICAgICAgZnJlZV93aWxsID0gImRlY2lkZSIsCiAgICAgICAgICAgY2hvaWNlcyA9ICJjaG9pY2VzIiwKICAgICAgICAgICBzZWxmX3Jlc3RyYWludCA9ICJzZWxmLWNvbnRyb2wiLAogICAgICAgICAgIGludGVudGlvbnMgPSAicGxhbnMiLAogICAgICAgICAgIGdvYWwgPSAiZ29hbHMiLAogICAgICAgICAgIGNvbnNjaW91cyA9ICJhd2FyZSIsCiAgICAgICAgICAgc2VsZl9hd2FyZSA9ICJzZWxmLWF3YXJlIiwKICAgICAgICAgICBkZXNpcmVzID0gImRlc2lyZXMiLAogICAgICAgICAgIGVtYmFycmFzc2VkID0gImVtYmFycmFzc2VkIiwKICAgICAgICAgICBlbW9fcmVjb2cgPSAiZW1wYXRoeSIsCiAgICAgICAgICAgam95ID0gImpveSIsCiAgICAgICAgICAgbW9yYWxpdHkgPSAibW9yYWxpdHkiLAogICAgICAgICAgIHBlcnNvbmFsaXR5ID0gInBlcnNvbmFsaXR5IiwKICAgICAgICAgICBwbGVhc3VyZSA9ICJwbGVhc3VyZSIsCiAgICAgICAgICAgcHJpZGUgPSAicHJpZGUiKSkpCgojIG1ha2UgZGF0YWZyYW1lIGZvciBwbG90dGluZwpzY2F0dGVyX3Bsb3R0aW5nIDwtIGxvYWRpbmdzKGVmYV9kMl9yb3RhdGVkTilbXSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgcmVuYW1lKEhFQVJUID0gTVIxLAogICAgICAgICBCT0RZID0gTVIyLAogICAgICAgICBNSU5EID0gTVIzKSAlPiUKICBmdWxsX2pvaW4od29yZGluZ19zMikgJT4lCiAgbXV0YXRlKGRvbWluYW50ID0gZmFjdG9yKAogICAgaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhCT0RZKSwgIkJPRFkiLAogICAgICAgICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoSEVBUlQpLCAiSEVBUlQiLAogICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKE1JTkQpLCAiTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSksCiAgICBzaXplID0gaWZlbHNlKHBtYXgoYWJzKEJPRFkpLCBhYnMoSEVBUlQpLCBhYnMoTUlORCkpID09IGFicyhCT0RZKSwgYWJzKEJPRFkpLAogICAgICAgICAgICAgICAgICBpZmVsc2UocG1heChhYnMoQk9EWSksIGFicyhIRUFSVCksIGFicyhNSU5EKSkgPT0gYWJzKEhFQVJUKSwgYWJzKEhFQVJUKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwbWF4KGFicyhCT0RZKSwgYWJzKEhFQVJUKSwgYWJzKE1JTkQpKSA9PSBhYnMoTUlORCksIGFicyhNSU5EKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgIGNvbG9yID0gaWZlbHNlKGRvbWluYW50ID09ICJCT0RZIiwgIiNFNDFBMUMiLAogICAgICAgICAgICAgICAgICAgaWZlbHNlKGRvbWluYW50ID09ICJIRUFSVCIsICIjNERBRjRBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZG9taW5hbnQgPT0gIk1JTkQiLCAiI0U0MUExQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQoKIyBwbG90IQpmaWdTMiA8LSBwbG90X2x5KHNjYXR0ZXJfcGxvdHRpbmcsIHggPSB+SEVBUlQsIHkgPSB+Qk9EWSwgeiA9IH5NSU5ELAogICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICAgY29sb3IgPSB+ZG9taW5hbnQsIGNvbG9ycyA9IGMoIiNFNDFBMUMiLCAiIzM3N0VCOCIsICIjNERBRjRBIiksCiAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0KSwKICAgICAgICAgICAgIHRleHQgPSB+c2hvcnQsCiAgICAgICAgICAgICB0ZXh0Zm9udCA9IGxpc3Qoc2l6ZSA9IDE1KSwKICAgICAgICAgICAgIG1vZGUgPSAidGV4dCttYXJrZXJzIiwKICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBUUlVFKQoKZmlnUzIKYGBgCgojIyBIZWF0bWFwcwoKKk5PVEU6IHNldCB0byAzIGZhY3RvcnMgbWFudWFsbHksIGZvciBub3cuKgoKIyMjIFN0dWR5IDEgKGFkdWx0cykKCmBgYHtyIGZpZ3VyZSBoZWF0bWFwIHMxLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30KZmFjdG9yc19zMSA8LSBmYS5zb3J0KGZhKGQxX2FsbCwgbmZhY3RvcnMgPSAzLCBjb3IgPSBjaG9zZW5Db3JUeXBlLCByb3RhdGUgPSBjaG9zZW5Sb3RUeXBlKSRsb2FkaW5nc1tdKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJpdGVtIikgJT4lCiAgZnVsbF9qb2luKHdvcmRpbmdfczEpICU+JQogIHNlbGVjdCh3b3JkaW5nLCBNUjEsIE1SMiwgTVIzKSAlPiUKICByZW5hbWUoY2FwYWNpdHkgPSB3b3JkaW5nLCBGYWN0b3IxID0gTVIxLCBGYWN0b3IyID0gTVIyLCBGYWN0b3IzID0gTVIzKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhvcmRlcikpCgpmYWN0b3JzX3MxX2xvbmcgPC0gZmFjdG9yc19zMSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHksIC1vcmRlcikgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvcikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGMSIsICJGMyIsICJGMiIpKSkgJT4lCiAgIyBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGdzdWIoIkZhY3RvciIsICJGIiwgZmFjdG9yKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRjIiLCAiRjEiLCAiRjMiKSkpICU+JQogIGFycmFuZ2Uob3JkZXIsIGZhY3RvcikKCmZhY3RvcnNfczFfYmxhbmsxIDwtIGZhY3RvcnNfczFfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3MxX2xvbmckbG9hZGluZykpKQojIGZhY3RvcnNfczFfYmxhbmsyIDwtIGZhY3RvcnNfczFfbG9uZyAlPiUKIyAgIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciA9PSAiRjEiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zMV9sb25nJGxvYWRpbmcpKjIvMykpKQpmYWN0b3JzX3MxX2JsYW5rMiA8LSBmYWN0b3JzX3MxX2xvbmcgJT4lCiAgbXV0YXRlKGxvYWRpbmcgPSBpZmVsc2UoZmFjdG9yID09ICJGMiIsIGxvYWRpbmcsIHJlcCgxMDAsIGxlbmd0aChmYWN0b3JzX3MxX2xvbmckbG9hZGluZykqMi8zKSkpCmZhY3RvcnNfczFfYmxhbmszIDwtIGZhY3RvcnNfczFfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgIT0gIkYzIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczFfbG9uZyRsb2FkaW5nKSoxLzMpKSkKCiMgZ2dwbG90KGZhY3RvcnNfczFfYmxhbmsxLCBhZXMoeCA9IGZhY3RvciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zMV9ibGFuazIsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMjApKSArCiMgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCiMgCiMgZ2dwbG90KGZhY3RvcnNfczFfYmxhbmszLCBhZXMoeCA9IGZhY3RvciwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKIyAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKIyAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLCBicmVha3MgPSBjKC0xLCAwLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwojICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMAoKZ2dwbG90KGZhY3RvcnNfczFfbG9uZywgYWVzKHggPSBmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpLCBzaXplID0gNikgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICAjIGdlb21fcmVjdChhZXMoeG1pbiA9IDAuNTEsIHhtYXggPSAxLjQ5LCB5bWluID0gMTQuNTUsIHltYXggPSAyMC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMS41MSwgeG1heCA9IDIuNDksIHltaW4gPSA2LjU1LCB5bWF4ID0gMTQuNDUpLAogICMgICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gLjUpICsKICAjIGdlb21fcmVjdChhZXMoeG1pbiA9IDIuNTEsIHhtYXggPSAzLjQ5LCB5bWluID0gMC41NSwgeW1heCA9IDYuNDUpLAogICMgICAgICAgICAgIGFscGhhID0gMCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gLjUpICsKICAjIHRoZW1lX2J3KCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMApgYGAKCiMjIyBTdHVkeSAyICg3LTl5KQoKYGBge3IgZmlndXJlIGhlYXRtYXAgczIsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQpmYWN0b3JzX3MyIDwtIGZhLnNvcnQoZmEoZDJfYWxsLCBuZmFjdG9ycyA9IDMsIGNvciA9IGNob3NlbkNvclR5cGUsIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUpJGxvYWRpbmdzW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIml0ZW0iKSAlPiUKICBmdWxsX2pvaW4od29yZGluZ19zMikgJT4lCiAgc2VsZWN0KHdvcmRpbmcsIE1SMSwgTVIyLCBNUjMpICU+JQogIHJlbmFtZShjYXBhY2l0eSA9IHdvcmRpbmcsIEZhY3RvcjEgPSBNUjEsIEZhY3RvcjIgPSBNUjIsIEZhY3RvcjMgPSBNUjMpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKG9yZGVyKSkKCmZhY3RvcnNfczJfbG9uZyA8LSBmYWN0b3JzX3MyICU+JQogIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSwgLW9yZGVyKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGdzdWIoIkZhY3RvciIsICJGIiwgZmFjdG9yKSkpICU+JQogICMgbXV0YXRlKGZhY3RvciA9IGZhY3Rvcihnc3ViKCJGYWN0b3IiLCAiRiIsIGZhY3RvciksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkYxIiwgIkYzIiwgIkYyIikpKSAlPiUKICAjIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZ3N1YigiRmFjdG9yIiwgIkYiLCBmYWN0b3IpLAogICMgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGMiIsICJGMSIsICJGMyIpKSkgJT4lCiAgYXJyYW5nZShvcmRlciwgZmFjdG9yKQoKZmFjdG9yc19zMl9ibGFuazEgPC0gZmFjdG9yc19zMl9sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczJfbG9uZyRsb2FkaW5nKSkpCmZhY3RvcnNfczJfYmxhbmsyIDwtIGZhY3RvcnNfczJfbG9uZyAlPiUKICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYxIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczJfbG9uZyRsb2FkaW5nKSoyLzMpKSkKIyBmYWN0b3JzX3MyX2JsYW5rMiA8LSBmYWN0b3JzX3MyX2xvbmcgJT4lCiMgICBtdXRhdGUobG9hZGluZyA9IGlmZWxzZShmYWN0b3IgPT0gIkYyIiwgbG9hZGluZywgcmVwKDEwMCwgbGVuZ3RoKGZhY3RvcnNfczJfbG9uZyRsb2FkaW5nKSoyLzMpKSkKZmFjdG9yc19zMl9ibGFuazMgPC0gZmFjdG9yc19zMl9sb25nICU+JQogIG11dGF0ZShsb2FkaW5nID0gaWZlbHNlKGZhY3RvciAhPSAiRjMiLCBsb2FkaW5nLCByZXAoMTAwLCBsZW5ndGgoZmFjdG9yc19zMl9sb25nJGxvYWRpbmcpKjEvMykpKQoKIyBnZ3Bsb3QoZmFjdG9yc19zMl9ibGFuazEsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhvcmRlcikpLCBmaWxsID0gbG9hZGluZykpICsKIyAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKIyAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLCBicmVha3MgPSBjKC0xLCAwLCAxKSwKIyAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwojICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiMgICB0aGVtZV9taW5pbWFsKCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAjIDEwMDAgYnkgMTAwMAojIAojIGdncGxvdChmYWN0b3JzX3MyX2JsYW5rMiwgYWVzKHggPSBmYWN0b3IsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGxvYWRpbmcpKSArCiMgICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSkgKwojICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAyMCkpICsKIyAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwojICAgdGhlbWVfbWluaW1hbCgpICsKIyAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiMgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgIyAxMDAwIGJ5IDEwMDAKIyAKIyBnZ3Bsb3QoZmFjdG9yc19zMl9ibGFuazMsIGFlcyh4ID0gZmFjdG9yLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwojICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIikgKwojICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSkpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksIGJyZWFrcyA9IGMoLTEsIDAsIDEpLAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMjApKSArCiMgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCgpnZ3Bsb3QoZmFjdG9yc19zMl9sb25nLCBhZXMoeCA9IGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIGZpbGwgPSBsb2FkaW5nKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSA2KSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwgYnJlYWtzID0gYygtMSwgMCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDIwKSkgKwogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMC41MSwgeG1heCA9IDEuNDksIHltaW4gPSAxNC41NSwgeW1heCA9IDIwLjQ1KSwKICAjICAgICAgICAgICBhbHBoYSA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IC41KSArCiAgIyBnZW9tX3JlY3QoYWVzKHhtaW4gPSAxLjUxLCB4bWF4ID0gMi40OSwgeW1pbiA9IDYuNTUsIHltYXggPSAxNC40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluID0gMi41MSwgeG1heCA9IDMuNDksIHltaW4gPSAwLjU1LCB5bWF4ID0gNi40NSksCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAuNSkgKwogICMgdGhlbWVfYncoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICMgMTAwMCBieSAxMDAwCmBgYAoKIyMgTWVhbiByYXRpbmdzCgojIyMgU3R1ZGllcyAxLTIKCk1lYW4gcmF0aW5ncyBvZiA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3IgdGhlIDIgZW50aXRpZXMgaW5jbHVkZWQgaW4gU3R1ZGllcyAxLTIuIFBhcnRpY2lwYW50cyByZXNwb25kZWQgb24gYSAzLXBvaW50IHNjYWxlICgwID0gIm5vIiwgMC41ID0gImtpbmRhIiwgMSA9ICJ5ZXMiKS4gRXJyb3IgYmFycyBhcmUgbm9ucGFyYW1ldHJpYyBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBNZW50YWwgY2FwYWNpdGllcyBhcmUgZ3JvdXBlZCBhY2NvcmRpbmcgdG8gdGhlaXIgZG9taW5hbnQgZmFjdG9yIGxvYWRpbmcgaW4gU3R1ZHkgMSAoYWR1bHRzKS4KCmBgYHtyIGZpZ3VyZSBtZWFuIHJhdGluZ3MgczEtczIsIGZpZy53aWR0aCA9IDMsIGZpZy5oZWlnaHQgPSAzfQojIG1ha2UgZGF0YWZyYW1lCnMxMl9wbG90dGluZyA8LSBjaGFyX3Bsb3R0aW5nICU+JQogIGZpbHRlcihzdHVkeSAlaW4lIGMoInN0dWR5IDEiLCAic3R1ZHkgMiIpKSAlPiUKICBkaXN0aW5jdCgpCgojIHBsb3QhIChvcmRlcmVkIGJ5IHN0dWR5IDEgZmFjdG9yIGxvYWRpbmdzKQpzMTIgPC0gZ2dwbG90KHMxMl9wbG90dGluZywKICAgICAgICAgICAgICAgYWVzKHkgPSBNZWFuLCB4ID0gcmVvcmRlcih3b3JkaW5nLCBkZXNjKHMxX29yZGVyKSksCiAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBmYWN0b3IoczFfY29sb3IpLCBzaGFwZSA9IHN0dWR5KSkgKwogIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjYpLCBzaXplID0gMikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwgd2lkdGggPSAwLjQsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42KSkgKwogIGZhY2V0X3dyYXAofiBjaGFyYWN0ZXIpICsKICB0aGVtZV9idygpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJcbk1lYW4gcmF0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAwLjUsIDEpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwXG4obm8pIiwgIjAuNVxuKGtpbmRhKSIsICIxXG4oeWVzKSIpKSArCiAgc2NhbGVfc2hhcGVfZGlzY3JldGUobmFtZSA9ICJTdHVkeToiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlN0dWR5IDE6IGFkdWx0cyIsICJTdHVkeSAyOiA3LTl5IikpICsKICAjIHNjYWxlX2NvbG91cl9icmV3ZXIobmFtZSA9ICJGYWN0b3I6IiwKICAjICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9IDYsCiAgIyAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gRkFMU0UpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWUgPSAiRmFjdG9yOiIsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjRTQxQTFDIiwgIiM0REFGNEEiLCAiIzM3N0VCOCIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQk9EWSIsICJNSU5EIiwgIkhFQVJUIikpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLAogICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gcGFsZXR0ZV9zMSksCiAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpzMTIKYGBgCgojIE1lYW4gZmFjdG9yIHNjb3JlcwoKIyMgU3R1ZGllcyAxLTIKCmBgYHtyIHMxMiBhbGwgbm8gcm90YXRpb24sIGluY2x1ZGUgPSBGfQojIG1ha2UgY29tYmluZWQgZGF0YXNldApkMTJfYWxsIDwtIGQxX2FsbCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGZ1bGxfam9pbihkMl9hbGwgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCgojIGV4YW1pbmUgc2NyZWUgcGxvdAojIGZhLnBhcmFsbGVsKGQxMl9hbGwpCgojIHJ1biBFRkEgd2l0aG91dCByb3RhdGlvbiB3aXRoIE4gZmFjdG9ycwplZmFfZDEyX2FsbF91bnJvdGF0ZWQgPC0gZmEoZDEyX2FsbCwgMTMsIHJvdGF0ZSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKZmEuc29ydChlZmFfZDEyX2FsbF91bnJvdGF0ZWQpCgojIGV4YW1pbmUgZWlnZW52YWx1ZXMgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZAplZmFfZDEyX2FsbF91bnJvdGF0ZWRfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2QxMl9hbGxfdW5yb3RhdGVkKSRWYWNjb3VudGVkICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkKCiMgY291bnQgZmFjdG9ycyB3aXRoIGVpZ2VudmFsdWVzID4gMSBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkID4gNSUKZWZhX2QxMl9hbGxfdW5yb3RhdGVkX25mYWN0b3JzIDwtIGVmYV9kMTJfYWxsX3Vucm90YXRlZF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9kMTJfYWxsX3Vucm90YXRlZF9uZmFjdG9ycwpgYGAKCmBgYHtyIHMxMiBhbGwgcm90YXRpb24sIGluY2x1ZGUgPSBGfQplZmFfZDEyX2FsbF9yb3RhdGVkX21heCA8LSBmYShkMTJfYWxsLCAxMywgcm90YXRlID0gY2hvc2VuUm90VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yID0gY2hvc2VuQ29yVHlwZSwgZm0gPSAibWlucmVzIikKCmVmYV9kMTJfYWxsX3JvdGF0ZWQgPC0gZmEoZDEyX2FsbCwgZWZhX2QxMl9hbGxfdW5yb3RhdGVkX25mYWN0b3JzLCByb3RhdGUgPSBjaG9zZW5Sb3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3IgPSBjaG9zZW5Db3JUeXBlLCBmbSA9ICJtaW5yZXMiKQoKIyBjaGVjayB0aGF0IGVhY2ggb2YgdGhlc2UgZmFjdG9ycyBpcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBhdCBsZWFzdCBvbmUgbWVudGFsIGNhcGFjaXR5IGl0ZW0KZWZhX2QxMl9hbGxfcm90YXRlZF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9kMTJfYWxsX3JvdGF0ZWQpW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICBtdXRhdGUobG9hZGluZ19hYnMgPSBhYnMobG9hZGluZykpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nX2FicykgJT4lCiAgdW5ncm91cCgpCmVmYV9kMTJfYWxsX3JvdGF0ZWRfbG9hZGluZ3MKCiMgZHJvcCBhbnkgZmFjdG9ycyB3aGVyZSBuIDwgMQplZmFfZDEyX2FsbF9yb3RhdGVkX2xvYWRpbmdzICU+JSAKICBjb3VudChmYWN0b3IpICU+JSAKICBmaWx0ZXIobiA+IDApCgojIHNldCBudW1iZXIgb2YgZmFjdG9ycyB0byBleHRyYWN0Cm5mYWN0b3JzX2QxMl9hbGwgPC0gZWZhX2QxMl9hbGxfcm90YXRlZF9sb2FkaW5ncyAlPiUgCiAgY291bnQoZmFjdG9yKSAlPiUgCiAgZmlsdGVyKG4gPiAwKSAlPiUKICBucm93KCkKbmZhY3RvcnNfZDEyX2FsbApgYGAKCmBgYHtyIHMxMiBhbGwgb2JsaW1pbiByb3RhdGlvbiwgaW5jbHVkZSA9IEZ9CiMgcnVuIEVGQSB3aXRoIHJvdGF0aW9uIHdpdGggTiBmYWN0b3JzCmVmYV9kMTJfYWxsX3JvdGF0ZWROIDwtIGZhKGQxMl9hbGwsIG5mYWN0b3JzX2QxMl9hbGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSA9IGNob3NlblJvdFR5cGUsIGNvciA9IGNob3NlbkNvclR5cGUsIGZtID0gIm1pbnJlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgbWlzc2luZyA9IFRSVUUpICMgaW1wdXRlIG1pc3NpbmcgdmFsdWVzCmZhLnNvcnQoZWZhX2QxMl9hbGxfcm90YXRlZE4pCgojIGdldCBsb2FkaW5ncyBmb3IgZWFjaCBmYWN0b3IKZWZhX2QxMl9hbGxfcm90YXRlZE5fbG9hZGluZ3MgPC0gbG9hZGluZ3MoZWZhX2QxMl9hbGxfcm90YXRlZE4pW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4odmFyID0gImNhcGFjaXR5IikKYGBgCgpgYGB7ciBzMTIgbG9hZGluZ3MgdGFibGUsIGluY2x1ZGUgPSBGfQpkYXRhLmZyYW1lKGxvYWRpbmdzKGZhLnNvcnQoZWZhX2QxMl9hbGxfcm90YXRlZE4pKVtdKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIk0iKSksIGZ1bnMocm91bmQyKSkKYGBgCgpgYGB7ciBzMTIgZmlndXJlIHNldHVwLCBpbmNsdWRlID0gRn0Kc2NvcmVzX3MxMl9wbG90dGluZyA8LSBkMSAlPiUgCiAgc2VsZWN0KHN1YmlkLCBhZ2VfZ3JvdXAsIGNoYXJhY3RlcikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogIGZ1bGxfam9pbihkMiAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHN1YmlkLCBhZ2VfZ3JvdXAsIGNoYXJhY3RlcikgJT4lIAogICAgICAgICAgICAgIGRpc3RpbmN0KCkgJT4lIAogICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpKSAlPiUKICBmdWxsX2pvaW4oZWZhX2QxMl9hbGxfcm90YXRlZE4kc2NvcmVzICU+JSAKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIAogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIpKSAlPiUKICByZW5hbWUoc2NvcmVfRjEgPSBNUjEsIHNjb3JlX0YyID0gTVIyLCBzY29yZV9GMyA9IE1SMykgJT4lCiAgZmlsdGVyKCFpcy5uYShzY29yZV9GMSksICFpcy5uYShzY29yZV9GMiksICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2VfZ3JvdXApKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgc3RhcnRzX3dpdGgoInNjb3JlXyIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHNjb3JlKSkpKQpgYGAKCmBgYHtyIHMxMiByZWdyZXNzaW9ufQp0ZW1wQyA8LSBkMSAlPiUgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkgJT4lCiAgZnVsbF9qb2luKGQyICU+JSBtdXRhdGUoc3ViaWQgPSBwYXN0ZShjaGFyYWN0ZXIsIHN1YmlkLCBzZXAgPSAiXyIpKSkgJT4lCiAgZnVsbF9qb2luKGRhdGEuZnJhbWUoZWZhX2QxMl9hbGxfcm90YXRlZE4kc2NvcmVzKSAlPiUKICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogICAgICAgICAgICAgIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtc3ViaWQpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciksCiAgICAgICAgIGFnZV9ncm91cCA9IGZhY3RvcihhZ2VfZ3JvdXApLAogICAgICAgICBjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgIyAlPiUKICAjIGZpbHRlcighaXMubmEoZmFjdG9yKSwgIWlzLm5hKGFnZV9ncm91cCksICFpcy5uYShjaGFyYWN0ZXIpKQoKY29udHJhc3RzKHRlbXBDJGZhY3RvcikgPSBjYmluZChmYWN0b3IxID0gYygxLCAtMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yMyA9IGMoMCwgLTEsIDEpKQoKY29udHJhc3RzKHRlbXBDJGFnZV9ncm91cCkgPSBjYmluZChjaGlsZHJlbiA9IGMoLTEsIDEpKQpjb250cmFzdHModGVtcEMkY2hhcmFjdGVyKSA9IGNiaW5kKHJvYm90ID0gYygtMSwgMSkpCgpyMSA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICogYWdlX2dyb3VwICsgKDEgfCBzdWJpZCkgLCB0ZW1wQykKc3VtbWFyeShyMSkKCnIxYiA8LSBicm0oc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBhZ2VfZ3JvdXAgKyAoMSB8IHN1YmlkKSAsIHRlbXBDLAogICAgICAgICAgICBmYW1pbHkgPSAiZ2F1c3NpYW4iLCBjb3JlcyA9IG5fY29yZXMpCnN1bW1hcnkocjFiKQpgYGAKCmBgYHtyfQojIHIxYyA8LSBicm0oc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBhZ2VfZ3JvdXAgKyAoZmFjdG9yIHwgc3ViaWQpICwgdGVtcEMsCiMgICAgICAgICAgICAgZmFtaWx5ID0gImdhdXNzaWFuIiwgY29yZXMgPSBuX2NvcmVzKQojIHN1bW1hcnkocjFjKQpgYGAKCmBgYHtyIHMxMiBmaWd1cmUgZmFjdG9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSAzfQojIHBsb3QKZ2dwbG90KHNjb3Jlc19zMTJfcGxvdHRpbmcgJT4lCiAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIkJvZGlseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJIZWFydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWluZCIpKSwKICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxldmVscyA9IGMoImFkdWx0cyIsICJjaGlsZHJlbl83OSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW4iKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY2hpbGRyZW5fNzkiLCAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjaGlsZHJlbiIsICJhZHVsdHMiKSkpLAogICAgICAgYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSBNZWFuLCBjb2xvciA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfd3JhcCgiZmFjdG9yIiwgbmNvbCA9IDMpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBnZW9tX3BvaW50KHNpemUgPSA1LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC40KSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwKICAgICAgICAgICAgICAgIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNCkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGFnZSBncm91cCIsCiAgICAgICAjIHN1YnRpdGxlID0gIkFkdWx0cyAoU3R1ZHkgMSkgdnMuIGNoaWxkcmVuIChTdHVkeSAyKVxuIiwKICAgICAgIHggPSAiQWdlIGdyb3VwIiwKICAgICAgIHkgPSAiTWVhbiBmYWN0b3Igc2NvcmUiKSAjIDEwMDAgYnkgNTAwCmBgYAoKIyBGYWN0b3Igc2NvcmVzIGJ5IGFnZQoKIyMgU3R1ZHkgMQoKYGBge3IgczEgZmFjdG9yIHNjb3JlcyBieSBhZ2Ugc2V0dXAsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSAzfQpzY29yZXNfczFfcGxvdHRpbmcgPC0gZDEgJT4lIAogIHNlbGVjdChzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBtdXRhdGUoc3ViaWQgPSBwYXN0ZShjaGFyYWN0ZXIsIHN1YmlkLCBzZXAgPSAiXyIpKSAlPiUKICBmdWxsX2pvaW4oZWZhX2QxX3JvdGF0ZWROJHNjb3JlcyAlPiUgCiAgICAgICAgICAgICAgZGF0YS5mcmFtZSgpICU+JSAKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgJT4lCiAgcmVuYW1lKHNjb3JlX0YxID0gTVIxLCBzY29yZV9GMiA9IE1SMiwgc2NvcmVfRjMgPSBNUjMpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpLCAhaXMubmEoc2NvcmVfRjIpLCAhaXMubmEoc2NvcmVfRjMpLCAhaXMubmEoYWdlKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKQoKZ2dwbG90KHNjb3Jlc19zMV9wbG90dGluZyAlPiUKICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzY29yZV9GMSIsICJzY29yZV9GMiIsICJzY29yZV9GMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGFiZWxzID0gYygiU29jaWFsLWVtb3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICJCb2RpbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiUGVyY2VwdHVhbC1jb2duaXRpdmUiKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkhlYXJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kIikpKSwKICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsIGNvbG9yID0gY2hhcmFjdGVyLCBmaWxsID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKCJmYWN0b3IiLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGFkdWx0cycgYWdlIiwKICAgICAgICMgc3VidGl0bGUgPSAiQWR1bHRzIChTdHVkeSAxKVxuIiwKICAgICAgIHggPSAiQWdlICh5ZWFycykiLAogICAgICAgeSA9ICJGYWN0b3Igc2NvcmUiKSAjIDEwMDAgYnkgNTAwCmBgYAoKIyMgU3R1ZHkgMgoKYGBge3IgczIgZmFjdG9yIHNjb3JlcyBieSBhZ2UgcmVncmVzc2lvbn0Kc2NvcmVzX3MyX3Bsb3R0aW5nIDwtIGQyICU+JSAKICBzZWxlY3Qoc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKHN1YmlkID0gcGFzdGUoY2hhcmFjdGVyLCBzdWJpZCwgc2VwID0gIl8iKSkgJT4lCiAgIyBmdWxsX2pvaW4oZWZhX2QyX3JvdGF0ZWROJHNjb3JlcyAlPiUgCiAgZnVsbF9qb2luKGVmYV9kMTJfYWxsX3JvdGF0ZWQkc2NvcmVzICU+JSAKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lIAogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIpKSAlPiUKICByZW5hbWUoc2NvcmVfRjEgPSBNUjEsIHNjb3JlX0YyID0gTVIyLCBzY29yZV9GMyA9IE1SMykgJT4lCiAgZmlsdGVyKCFpcy5uYShzY29yZV9GMSksICFpcy5uYShzY29yZV9GMiksICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2UpKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgc3RhcnRzX3dpdGgoInNjb3JlXyIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpCgpjb250cmFzdHMoc2NvcmVzX3MyX3Bsb3R0aW5nJGZhY3RvcikgPSBjYmluZChmYWN0b3IxID0gYygxLCAtMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yMyA9IGMoMCwgLTEsIDEpKQoKY29udHJhc3RzKHNjb3Jlc19zMl9wbG90dGluZyRjaGFyYWN0ZXIpID0gY2JpbmQocm9ib3QgPSBjKC0xLCAxKSkKCnIyIDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBzY2FsZShhZ2UsIHNjYWxlID0gRikgKyAoMSB8IHN1YmlkKSAsIHNjb3Jlc19zMl9wbG90dGluZykKc3VtbWFyeShyMikKCiMgcjJiIDwtIGJybShzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciAqIGFnZSArICgxIHwgc3ViaWQpICwgc2NvcmVzX3MyX3Bsb3R0aW5nICU+JSBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSwgZmFtaWx5ID0gImdhdXNzaWFuIiwgY29yZXMgPSBuX2NvcmVzKQojIHN1bW1hcnkocjJiKQoKIyBsb29rIGF0IGhlYXJ0IG9ubHkKIyByMmNfaGVhcnQgPC0gYnJtKHNjb3JlIH4gY2hhcmFjdGVyICogYWdlLCAKIyAgICAgICAgICAgIGRhdGEgPSBzY29yZXNfczJfcGxvdHRpbmcgJT4lIAojICAgICAgICAgICAgICBmaWx0ZXIoZmFjdG9yID09ICJzY29yZV9GMSIpICU+JSAKIyAgICAgICAgICAgICAgbXV0YXRlKGFnZSA9IHNjYWxlKGFnZSwgc2NhbGUgPSBGKSksIAojICAgICAgICAgICAgZmFtaWx5ID0gImdhdXNzaWFuIiwgY29yZXMgPSBuX2NvcmVzKQojIHN1bW1hcnkocjJjX2hlYXJ0KQoKIyBsb29rIGF0IGJvZHkgb25seQojIHIyY19ib2R5IDwtIGJybShzY29yZSB+IGNoYXJhY3RlciAqIGFnZSwgCiMgICAgICAgICAgICBkYXRhID0gc2NvcmVzX3MyX3Bsb3R0aW5nICU+JSAKIyAgICAgICAgICAgICAgZmlsdGVyKGZhY3RvciA9PSAic2NvcmVfRjIiKSAlPiUgCiMgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpLCAKIyAgICAgICAgICAgIGZhbWlseSA9ICJnYXVzc2lhbiIsIGNvcmVzID0gbl9jb3JlcykKIyBzdW1tYXJ5KHIyY19ib2R5KQoKIyBsb29rIGF0IG1pbmQgb25seQojIHIyY19taW5kIDwtIGJybShzY29yZSB+IGNoYXJhY3RlciAqIGFnZSwgCiMgICAgICAgICAgICBkYXRhID0gc2NvcmVzX3MyX3Bsb3R0aW5nICU+JSAKIyAgICAgICAgICAgICAgZmlsdGVyKGZhY3RvciA9PSAic2NvcmVfRjMiKSAlPiUgCiMgICAgICAgICAgICAgIG11dGF0ZShhZ2UgPSBzY2FsZShhZ2UsIHNjYWxlID0gRikpLCAKIyAgICAgICAgICAgIGZhbWlseSA9ICJnYXVzc2lhbiIsIGNvcmVzID0gbl9jb3JlcykKIyBzdW1tYXJ5KHIyY19taW5kKQpgYGAKCmBgYHtyIHMyIGZhY3RvciBzY29yZXMgYnkgYWdlIHBsb3QsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSAzfQpnZ3Bsb3Qoc2NvcmVzX3MyX3Bsb3R0aW5nICU+JQogICAgICAgICB1bmdyb3VwKCkgJT4lCiAgICAgICAgIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkhlYXJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kIikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICMgbGFiZWxzID0gYygiU29jaWFsLWVtb3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIkJvZGlseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIlBlcmNlcHR1YWwtY29nbml0aXZlIikpKSwKICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gc2NvcmUsIGNvbG9yID0gY2hhcmFjdGVyLCBmaWxsID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKCJmYWN0b3IiLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGNoaWxkcmVuJ3MgYWdlIiwKICAgICAgICMgc3VidGl0bGUgPSAiQ2hpbGRyZW4gKFN0dWR5IDIpXG4iLAogICAgICAgeCA9ICJBZ2UgKHllYXJzKSIsCiAgICAgICB5ID0gIkZhY3RvciBzY29yZSIpICMgMTAwMCBieSA1MDAKYGBgCgojIyBTdHVkaWVzIDEtMgoKYGBge3IgczEyIHNjYXR0ZXIgcGx1cyBtZWFuIHNjb3JlcyBieSBhZ2Ugc2V0dXAsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSAzfQp0ZW1wQSA8LSBkMiAlPiUgCiAgc2VsZWN0KHN1YmlkLCBhZ2UsIGNoYXJhY3RlcikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogIGZ1bGxfam9pbihlZmFfZDEyX2FsbF9yb3RhdGVkTiRzY29yZXMgJT4lIAogICAgICAgICAgICAgIGRhdGEuZnJhbWUoKSAlPiUgCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIHJlbmFtZShzY29yZV9GMSA9IE1SMSwgc2NvcmVfRjIgPSBNUjIsIHNjb3JlX0YzID0gTVIzKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNjb3JlX0YxKSwgIWlzLm5hKHNjb3JlX0YyKSwgIWlzLm5hKHNjb3JlX0YzKSwgIWlzLm5hKGFnZSkpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCBzdGFydHNfd2l0aCgic2NvcmVfIikpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiSGVhcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kIikpKQogICAgICAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiQm9kaWx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiUGVyY2VwdHVhbC1jb2duaXRpdmUiKSkpCgp0ZW1wQiA8LSBzY29yZXNfczEyX3Bsb3R0aW5nICU+JQogIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkhlYXJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWluZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICMgbGFiZWxzID0gYygiU29jaWFsLWVtb3Rpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIkJvZGlseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIlBlcmNlcHR1YWwtY29nbml0aXZlIikpLAogICAgICAgICBhZ2UgPSAxMSkgCgpnZ3Bsb3QodGVtcEEsCiAgICAgICBhZXMoeCA9IGFnZSwgeSA9IHNjb3JlLCBjb2xvciA9IGNoYXJhY3RlciwgZmlsbCA9IGNoYXJhY3Rlciwgc2hhcGUgPSBjaGFyYWN0ZXIpKSArCiAgZmFjZXRfd3JhcCgiZmFjdG9yIiwgbmNvbCA9IDMpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ2VvbV9obGluZShkYXRhID0gdGVtcEIsIGFlcyh5aW50ZXJjZXB0ID0gTWVhbiwgY29sb3IgPSBjaGFyYWN0ZXIpLCBsdHkgPSAyKSArCiAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFscGhhID0gMC40KSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGdlb21fcG9pbnQoZGF0YSA9IHRlbXBCLCBhZXMoeSA9IE1lYW4pLAogICAgICAgICAgICAgc2l6ZSA9IDQsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjYpKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gdGVtcEIsIGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciwgeSA9IE1lYW4pLCB3aWR0aCA9IDAsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE5LCAxNSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg3OjExKSwgbGFiZWxzID0gYygiN3kiLCAiOHkiLCAiOXkiLCAiMTB5IiwgImFkdWx0cyIpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGFnZSIsCiAgICAgICAjIHN1YnRpdGxlID0gIkNoaWxkcmVuIChTdHVkeSAyKVxuIiwKICAgICAgIHggPSAiQWdlIiwKICAgICAgIHkgPSAiRmFjdG9yIHNjb3JlIikgIyAxMDAwIGJ5IDUwMApgYGAKCg==